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 }

 

posted @ 2017-04-28 21:24  Flowersea  阅读(277)  评论(0编辑  收藏  举报