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

时间:2023-03-08 17:44:20

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

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=+;
int dp[maxn];
int w[],c[];
int main(){ int n,m,maxnum;
while(cin>>maxnum>>n){
int a,b;
int num=;
for(int i=;i<=n;i++){
scanf("%d%d",&a,&b); for(int j=;j<=a;j<<=){
w[num++]=j*b;
a-=j;
}
if(a>)w[num++]=a*b;
}
memset(dp,,sizeof(dp));
for(int i=;i<num;i++)
for(int j=maxnum;j>=w[i];j--){
if(j-w[i]>=)
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
cout<<dp[maxnum]<<endl;
}
}