有一个人,他老婆叫他买一些东西,然后他决定去偷。他老婆给他了一张清单,清单上的所有的东西至少有c[i]个...然后他有一个W容量的包,问清单上的东西偷够之后他最多还能带走东西的最大价值为多少?能带走的物品是清单上的东西
先把背包的容量减去清单上要偷的,剩下的做一个完全背包就好了...
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 100000007
#define inf 0x3f3f3f3f
int p[120],c[120],w[120];
int dp[12000];
int main()
{
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++)
{
int n,W;
scanf("%d %d",&n,&W);
int sum=0;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&p[i],&c[i],&w[i]);
sum+=c[i]*w[i];
}
printf("Case %d: ",cas);
if(sum>W)
{
printf("Impossible\n");
continue;
}
W-=sum;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=w[i];j<=W;j++)
{
dp[j]=max(dp[j],dp[j-w[i]]+p[i]);
}
}
printf("%d\n",dp[W]);
}
return 0;
}