POJ 3260 多重背包+完全背包

Posted Flowersea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3260 多重背包+完全背包相关的知识,希望对你有一定的参考价值。

链接:

http://poj.org/problem?id=3260

题意:

你去买总价为t的东西,每种硬币你有k枚,老板有无数枚,求硬币交换数目最少的数目

题解:

你是多重背包,老板是完全背包,先预处理一下,然后计算取总和最小的就行了

代码:

31 int v[MAXN], c[MAXN];
32 int dp1[MAXN], dp2[MAXN];
33 int sum[MAXN];
34 
35 int main() {
36     int n, t;
37     cin >> n >> t;
38     rep(i, 1, n + 1) cin >> v[i];
39     rep(i, 1, n + 1) cin >> c[i];
40     memset(dp1, 0x3f, sizeof(dp1));
41     dp1[0] = 0;
42     rep(i, 1, n + 1) {
43         memset(sum, 0, sizeof(sum));
44         rep(j, v[i], MAXN) if (dp1[j - v[i]] != INF && sum[j - v[i]] < c[i] && dp1[j] > dp1[j - v[i]] + 1)
45             dp1[j] = dp1[j - v[i]] + 1, sum[j] = sum[j - v[i]] + 1;
46     }
47 
48     memset(dp2, 0x3f, sizeof(dp2));
49     dp2[0] = 0;
50     rep(i, 1, n + 1) rep(j, v[i], MAXN) dp2[j] = min(dp2[j], dp2[j - v[i]] + 1);
51     int ans = INF;
52     rep(i, t, MAXN) ans = min(ans, dp1[i] + dp2[i - t]);
53     if (ans == INF) ans = -1;
54     cout << ans << endl;
55     return 0;
56 }

 

以上是关于POJ 3260 多重背包+完全背包的主要内容,如果未能解决你的问题,请参考以下文章

poj 3260 最少硬币(01+多重+完全背包)

POJ 3260 The Fewest Coins(多重背包+全然背包)

POJ-3260 The Fewest Coins

POJ1276 多重背包(01背包 完全背包)

POJ - 1787 (多重背包还原路径|| 完全背包)

POJ3260The Fewest Coins[背包]