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; }