码迷,mamicode.com
首页 > 其他好文 > 详细

poj1276 多重背包

时间:2014-09-18 23:30:04      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   for   div   

bubuko.com,布布扣
 1 //Accepted    1100 KB    47 ms
 2 //多重背包
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <queue>
 7 #include <cmath>
 8 #include <algorithm>
 9 using namespace std;
10 /**
11   * This is a documentation comment block
12   * 如果有一天你坚持不下去了,就想想你为什么走到这儿!
13   * @authr songt
14   */
15 const int imax_v = 100005;
16 const int imax_n = 15;
17 int dp[imax_v];
18 int weight[imax_n],amount[imax_n];
19 int n,v;
20 int max(int a,int b)
21 {
22     return a>b?a:b;
23 }
24 void zeroOnePack(int weight,int value,int v)
25 {
26     for (int j=v;j>=weight;j--)
27     dp[j]=max(dp[j],dp[j-weight]+value);
28 }
29 void completePack(int weight,int value,int v)
30 {
31     for (int j=weight;j<=v;j++)
32     dp[j]=max(dp[j],dp[j-weight]+value);
33 }
34 void multiplePack(int weight,int value,int amount,int v)
35 {
36     int k=1;
37     if (amount*weight>=v)
38     {
39         completePack(weight,value,v);
40         return ;
41     }
42     while (k<amount)
43     {
44         zeroOnePack(k*weight,k*value,v);
45         amount-=k;
46         k<<=1;
47     }
48     zeroOnePack(amount*weight,amount*value,v);
49 }
50 void Dp()
51 {
52     for (int i=1;i<=v;i++) dp[i]=0;
53     for (int i=1;i<=n;i++)
54     {
55         multiplePack(weight[i],weight[i],amount[i],v);
56     }
57     int ans=0;
58     for (int i=1;i<=v;i++)
59     ans=max(ans,dp[i]);
60     printf("%d\n",ans);
61 }
62 int main()
63 {
64     while (scanf("%d%d",&v,&n)!=EOF)
65     {
66         for (int i=1;i<=n;i++)
67         scanf("%d%d",&amount[i],&weight[i]);
68         Dp();
69     }
70     return 0;
71 }
View Code

 

poj1276 多重背包

标签:style   blog   http   color   io   os   ar   for   div   

原文地址:http://www.cnblogs.com/djingjing/p/3980168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!