POJ 1276 Cash Machine(多重背包)

题目链接

好久 好久 好久 没搞过多重背包的题了,不过还是挺模版的。加上二进制优化了,不加目测会超时。

每次都感觉自己写的转换二进制,这么搓呢。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 100001
 4 int p[N],v[N];
 5 int main()
 6 {
 7     int i,j,k,c,num,n,sum,vv,max;
 8     while(scanf("%d",&c)!=EOF)
 9     {
10         memset(p,0,sizeof(p));
11         memset(v,0,sizeof(v));
12         scanf("%d",&n);
13         j = 1;
14         for(i = 1;i <= n;i ++)
15         {
16             scanf("%d%d",&num,&vv);
17             sum = vv*num;k = vv;
18             for(;;)
19             {
20                 if(sum <= 0)
21                 break;
22                 sum -= k;
23                 v[j] = k;
24                 j ++;
25                 k *= 2;
26                 if(k > sum)
27                 {
28                     if(sum != 0)
29                     {
30                         v[j] = sum;
31                         j ++;
32                     }
33                     break;
34                 }
35             }
36         }
37         n = j-1;
38         for(i = 1;i <= n;i ++)
39         {
40             for(j = c;j >= v[i];j --)
41             {
42                 if(p[j] < p[j-v[i]]+v[i])
43                 p[j] = p[j-v[i]]+v[i];
44             }
45         }
46         max = 0;
47         for(i = 1;i <= c;i ++)
48         if(max < p[i])
49         max = p[i];
50         printf("%d\n",max);
51     }
52     return 0;
53 }
posted @ 2012-07-30 16:14  Naix_x  阅读(219)  评论(0编辑  收藏  举报