题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191
代码写的很乱,根据题目的意思,这个一道多重背包的问题,转换成0-1背包,就是在0-1背包的基础上面再加一层for循环、、、、
#include <iostream>
using namespace std;
int max(int a, int b)
{
if(a>b)
return a;
else
return b;
}
int value[1000], weight[1000], sam[1000];
int dp[1000];
int main()
{
int t, money, various, i, p, h, c, j, k;
cin>>t;
while(t--)
{
memset(dp,0,sizeof(dp));
memset(value,0,sizeof(value));
memset(weight,0,sizeof(weight));
memset(sam,0,sizeof(sam));
cin>>money>>various;
for(i = 1; i <= various; i++)
{
cin>>value[i]>>weight[i]>>sam[i];
}
//此题当中是把重量当成每件物品的价值。把总的钱数当成背包的容量。
for(i = 1; i <= various; i++)
{
for(j = 1; j <= sam[i]; j++) //这层循环是在0-1背包的基础上面的加的循环。表示的是大米的袋数。
{
for(k = money; k >= value[i]; k--)
{
dp[k] = max(dp[k], dp[k-value[i]]+weight[i]);
}
}
}
cout<<dp[money]<<endl;
}
return 0;
}