洛谷 P2079 烛光晚餐 背包
作者:互联网
题意: 背包容量为V, 有n个物品, 每个物品有a价值, b价值, 和代价, 要使总的a价值不小于0, 在此基础上总的b价值最大.
思路: 背包
dp[j][k]中, j代表当前背包容量, k代表当前a价值是多少(将负的平移到正数范围内,0->500), dp[j][k]表示当前最大b价值.
递推式:dp[j][k]=dp[j-v[i]][k-a[i]]+b[i]
dp顺序: for i: 1 to n,
for j: V to 0,
for k: 0 to 1005
代码:
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;
const int M=2e5+5;
const int inf=1e9+5;
const int mod=1e9+7;
int dp[505][1005];
// v x
int x[505],y[505],c[505];
int main() {
fill(dp[0],dp[0]+505*1005,-inf);
int n,V;
scanf("%d%d",&n,&V);
for(int i=1; i<=n; i++) {
scanf("%d%d%d",&c[i],&x[i],&y[i]);
}
dp[0][500]=0;//500代表x满足度为0时
for(int i=1; i<=n; i++) {
for(int j=V; j>=0; j--) {
for(int k=0; k<1005; k++) {
if(k-x[i]>=0
&&k-x[i]<1005
&&j>=c[i]
&&dp[j][k]<dp[j-c[i]][k-x[i]]+y[i]) {
dp[j][k]=dp[j-c[i]][k-x[i]]+y[i];
}
}
}
}
int ans=0;
for(int i=0; i<=V; i++) {
for(int j=500; j<1005; j++) {
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
return 0;
}
标签:P2079,洛谷,当前,容量,背包,&&,价值,晚餐,dp 来源: https://blog.csdn.net/qq_32259423/article/details/90046112