poj1276 简单多重背包压缩为01背包 模板题 适用于w[i]=v[i];

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[100010];
int f[10010];
int main(){
    int M;
    int a[15];
    int b[15];
    while(cin>>M){
       int n;
       cin>>n;
       for(int i=0;i<n;i++)
          cin>>b[i]>>a[i];
        memset(dp,0,sizeof(dp));
        memset(f,0,sizeof(f));
        int k=1;//将多重背包压缩为01背包,且w[i]=v[i]
        int t;
        for(int i=0;i<n;i++){
            if(b[i]==0)
              continue;
            t=1;
            while(b[i]-t>0){
                f[k++]=t*a[i];
                b[i]-=t;
                t*=2;
            }
            f[k++]=b[i]*a[i];
        }//
        for(int i=0;i<k;i++)
           for(int j=M;j>=f[i];j--)
              dp[j]=max(dp[j],dp[j-f[i]]+f[i]);
        cout<<dp[M]<<endl;




        }



    }


你可能感兴趣的:(poj,背包)