Consumer
Problem Description
Input
Output
Sample Input
300 2 30 50 25 80
600 1 50 130
400 3 40 70 30 40 35 60
Sample Output
題目意思:有N個箱子,每個箱子需要花費Ai的代價
箱子裏面有K個物品,K個物品你可以選擇買任意個,但每個物品只能買一個,每個物品有相應的花費和價值
你又M的大洋,最後問最多能得到多少價值物品。
解題思路:先對每組選擇裏的所有物品進行0-1揹包處理,但揹包容量爲(總容量-盒子容量);然後跟上一組的狀態比較來決定這一組選擇是選還是不選,取其中的較大值。
#include<bits/stdc++.h>
using namespace std;
int dp[100005];
int tmp[100005];
int main()
{
int n,w,p,m,c,v;
while(~scanf("%d%d",&n,&w))
{
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
memcpy(tmp,dp,sizeof(dp));///繼承前面的
scanf("%d%d",&p,&m);
for(int j=0;j<m;j++)
{
scanf("%d%d",&c,&v);
for(int k=w-p;k>=c;k--)
{
tmp[k]=max(tmp[k],tmp[k-c]+v);
}
}
for(int k=p;k<=w;k++)
{
dp[k]=max(dp[k],tmp[k-p]);
}
}
printf("%d\n",dp[w]);
}
return 0;
}