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 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值