题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2660
解题报告:题目中对每个物品的取舍包含两个方面的因素 1、自己选择的宝石种类 2、妈妈所能接受的最大的重量。所以是二维背包的类型的问题
由于每个物品只能使用一次,求最大的价值,所以转换为01背包。即:for(int j=use;j>=0;j++)
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1005][1005],val[1005],w[1005];
int t,total,use,weight;
int main()
{
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&total,&use);
for(int i=1;i<=total;i++)
scanf("%d%d",&val[i],&w[i]);
scanf("%d",&weight);
for(int i=1;i<=total;i++)
for(int j=weight;j>=w[i];j--)
for(int k=use;k>=1;k--)
dp[j][k]=max(dp[j][k],dp[j-w[i]][k-1]+val[i]);
printf("%d\n",dp[weight][use]);
}
return 0;
}