HDU 2191(多重背包)

来源:互联网 发布:农村淘宝和快递公司 编辑:程序博客网 时间:2024/04/30 00:07
基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:

f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}


#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn = 205;int dp[maxn][maxn], v[maxn], w[maxn], c[maxn];int main(){int T,n,m;scanf("%d", &T);while (T--){scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++){scanf("%d%d%d", &v[i], &w[i], &c[i]);}int ans = 0;for (int i = 1; i <= m; i++){for (int j = n; j >= 1; j--){dp[i][j] = dp[i-1][j];for (int k = 0; k <= c[i] && j - k*v[i] >= 0; k++){dp[i][j] = max(dp[i][j], dp[i - 1][j - k*v[i]] + k*w[i]);}ans = max(ans, dp[i][j]);}}printf("%d\n", ans);}return 0;}


0 0