POJ_1276 Cash Machine (多重背包)

  又是几天不做题,一个二进制优化的多重背包让我写的狗屁不通,错漏百出!TLE, WA了好几次,都是细节啊。

思路,很裸的多重背包。


My Code:

 

 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4
5 using namespace std;
6
7 const int N = 100010;
8 const int M = 1024;
9
10 int f[N];
11 int k[M], c[M];
12
13 int Max(int x, int y) {
14 return x > y ? x : y;
15 }
16
17
18 int main() {
19 //freopen("data.in", "r", stdin);
20
21 int V, n, m, i, j;
22 while(~scanf("%d%d", &V, &n)) {
23 for(i = 0; i < n; ++i) {
24 scanf("%d%d", k + i, c + i);
25 }
26
27 for(i = 0; i <= V; ++i) f[i] = 0;
28
29 for(i = 0; i < n; ++i) {
30 if(k[i]*c[i] > V) { //complete pack
31 for(j = c[i]; j <= V; ++j) {
32 f[j] = Max(f[j], f[j - c[i]] + c[i]);
33 }
34 } else { //zero one pack with binary optimize
35 m = 1;
36 while(k[i]) {
37 if(m > k[i]) m = k[i];
38 k[i] -= m;
39 for(j = V; j >= c[i] * m; --j) {
40 f[j] = Max(f[j], f[j - c[i] * m] + c[i] * m);
41 }
42 m <<= 1;
43 }
44 }
45 }
46 printf("%d\n", f[V]);
47 }
48 return 0;
49 }

 

转载于:https://www.cnblogs.com/vongang/archive/2011/12/23/2299729.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值