Cash Machine POJ - 1276 多重背包二进制优化

题意:多重背包模型  n种物品 每个m个  问背包容量下最多拿多少 这里要用二进制优化不然会超时

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=100000+10;
 6 int dp[maxn];
 7 int w[500],c[50];
 8 int main(){
 9     
10     int n,m,maxnum;
11     while(cin>>maxnum>>n){
12         int a,b;
13         int num=1;
14         for(int i=1;i<=n;i++){
15             scanf("%d%d",&a,&b);
16         
17         for(int j=1;j<=a;j<<=1){
18            w[num++]=j*b;
19            a-=j;
20         }
21         if(a>0)w[num++]=a*b;
22     }
23     memset(dp,0,sizeof(dp));
24     for(int i=1;i<num;i++)
25         for(int j=maxnum;j>=w[i];j--){
26                 if(j-w[i]>=0)
27                 dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
28         }
29     cout<<dp[maxnum]<<endl;
30     }
31     }

 

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务