传送门:牛客
题目描述:
题目较长此处省略
输入:
1 1 74
2
1 502 47
输出:
408
自我感觉这道题还是挺难处理的(虽然代码不长,但是毕竟四星),经过了这道题感觉自己对于 01 背包 01背包 01背包的理解更上一层楼了
主要思路:
化解一下就是
b
j
∗
c
i
<
b
i
∗
c
j
b_j * c_i < b_i * c_j
bj∗ci<bi∗cj
然后我们直接根据上述sort一下即可
下面是具体的代码部分:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x = 0, w = 1;
char ch = getchar();
for (; ch > '9' || ch < '0'; ch = getchar()) if (ch == '-') w = -1;
for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps = 1e-8;
int n, m, t;
ll dp[1000010];int b[maxn];
struct Food{
int j,a,c;
}food[maxn];
bool cmp(Food aa,Food bb) {
return b[aa.j]*bb.c>b[bb.j]*aa.c;
}
int main() {
n = read();
m = read();
t = read();
for (int i = 1; i <= n; i++) b[i]=read();
for (int i = 1; i <= m; i++) {
food[i].j=read();food[i].a=read();food[i].c=read();
}
sort(food+1,food+1+m,cmp);
ll ans=-ll_maxn;
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for (int k = 1; k <= m; k++) {
for (int i = t; i >= food[k].c; i--) {
dp[i] = max(dp[i], dp[i - food[k].c] + food[k].a - i * b[food[k].j]);
ans=max(ans,dp[i]);
}
}
cout << ans << endl;
return 0;
}