二维费用的背包问题
物品总个数的限制
有时,“二维费用”的条件是以这样一种隐含的方式给出的:最多只能取M件物品。这事实上相当于每件物品多了一种“件数”的费用,每个物品的件数费用均为1,可以付出的最大件数费用为M。换句话说,设f[v][m]表示付出费用v、最多选m件时可得到的最大价值,则根据物品的类型(01、完全、多重)用不同的方法循环更新,最后在f[0..V][0..M]范围内寻找答案。
#include <stdio.h>
#include <string.h>
#define MAXN 1002
int dp[MAXN][22];
struct node
{
int val,w;
}stones[22];
int main()
{
int test,n,k,i,j,h,W;
scanf("%d",&test);
while(test--)
{
scanf("%d %d",&n,&k);
for(i=0;i<n;++i)
scanf("%d %d",&stones[i].val,&stones[i].w);
scanf("%d",&W);
memset(dp,0,sizeof(dp));
for (i=0;i<n;++i)
{
for(j=W;j>=stones[i].w;--j)
for(h=k;h>0;--h)
if(dp[j][h]<dp[j-stones[i].w][h-1]+stones[i].val)
dp[j][h]=dp[j-stones[i].w][h-1]+stones[i].val;
}
printf("%d\n",dp[W][k]);
}
return 0;
}