HDU 2191
?題目鏈接: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;
}
總結
- 上一篇: 高精度模板 c++/类封装
- 下一篇: 113道C语言题目