hdu 2191(多重背包)

来源:互联网 发布:海岛奇兵菊花升级数据 编辑:程序博客网 时间:2024/03/29 20:37

http://acm.hdu.edu.cn/showproblem.php?pid=2191

一种转换成普通的01背包,遍历物品的个数。
另一种就是把物品个数用2^k表示,是上一种01背包的优化。

代码:

#include<iostream>using namespace std;int dp[105];int p[105], h[105], c[105];int m,t,n;void O1find(int w, int v){    for (int j = t; j >=v; j--){        dp[j] = dp[j] > (dp[j - v] + w) ? dp[j] : (dp[j - v] + w);    }}int main(){    cin >> m;    while (m--)    {        cin >> t >> n;        memset(dp, 0, sizeof(dp));        for (int i = 1; i <= n; i++){            cin >> p[i] >> h[i] >> c[i];        }        for (int i = 1; i <= n; i++){            for (int k = 1; k <= c[i];){                O1find(k*h[i] , k*p[i]);                c[i] -= k;                k = k * 2;            }            O1find(c[i]*h[i], c[i]*p[i]);        }        cout << dp[t] << endl;    }}
0 0
原创粉丝点击