hdu 2191

来源:互联网 发布:js中的短路表达式 编辑:程序博客网 时间:2024/05/25 23:57

题目链接: 点击打开链接

题目大意: 买米,给定总钱数,每种米的价格,重量,数量,问能买到的最大重量是多少

思路: 动态规划,多重背包

分析: 

多重背包入门题,直接套模板

代码:

#include <cstdio>#include <memory.h>#include <algorithm>using namespace std;const int maxm = 100 + 10;const int maxn = 100 + 10;int V, m, cost[maxm], weight[maxm], amount[maxm], dp[maxn];void ZeroOnePack(int cost, int value){for (int i = V; i >= cost; --i)dp[i] = max(dp[i], dp[i - cost] + value);}void ComPack(int cost, int value){for (int i = cost; i <= V; ++i)dp[i] = max(dp[i], dp[i - cost] + value);}void MulPack(int cost, int value, int amount){if (cost * amount > V) {ComPack(cost, value);return;}for (int i = 1; i <= amount; i <<= 1) {ZeroOnePack(cost * i, value * i);amount -= i;}ZeroOnePack(cost * amount, value * amount);}void solve(){memset(dp, 0, sizeof(dp));for (int i = 1; i <= m; ++i)MulPack(cost[i], weight[i], amount[i]);}int main(){int C;scanf("%d", &C);while (C--){scanf("%d %d", &V, &m);for (int i = 1; i <= m; ++i)scanf("%d %d %d", &cost[i], &weight[i], &amount[i]);solve();printf("%d\n", dp[V]);}return 0;}


0 0
原创粉丝点击