您的位置:首页 > 其它

ACM 多重背包 pku 1276

2011-04-14 16:38 357 查看
PKU 1276



#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 100001
int f[MAX];int content;//背包的容量
//01背包
void onepack(int cost,int value){
    for(int j=content;j>=cost;--j)
      f[j]=f[j]>f[j-cost]+value?f[j]:f[j-cost]+value;
}//完全背包
void complepack(int cost,int value){
  for(int j=cost;j<=content;++j)
    f[j]=f[j]>f[j-cost]+value?f[j]:f[j-cost]+value;
}//多重背包
void multpack(int cost,int value,int cnt){
  if(cost *cnt>=content){
    complepack(cost,value);return;
  }
  int k=1;
  while(k<cnt){
    onepack(k*cost,k*value);
    cnt-=k;
    k=k*2;
  }
  onepack(cnt*cost,cnt*value);
}
int main(int argc, char *argv[])
{
  int cnt[1000],v[1000];
  int n;
  while(cin>>content>>n){
    memset(f,0,sizeof(f));
    for(int i=0;i<n;++i)
      cin>>cnt[i]>>v[i];
    for(int i=0;i<n;++i)
   //用价值v[i]充当费用,因为在凑够M的钱时,用去了M的v[i],相当于使背包的容量用去了v[i]
      multpack(v[i],v[i],cnt[i]);
    cout<<f[content]<<endl;
  }
  return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: