题目链接: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;
}
本文详细解释了一道多重背包问题的转换过程,通过在0-1背包的基础上增加一层循环,解决大米袋数的限制问题。利用动态规划算法求解最优解。
350

被折叠的 条评论
为什么被折叠?



