参考资料《背包九讲》将题目中的100000看成10000 贡献数次RE。 #include <iostream> using namespace std; int num,V; //num物品个数,V为最大容量 int f[100005]; int c[15],w[15];//c[]物品重量,w[]物品价值 void zero_one_pack(int cost,int weight) { for(int v=V;v>=cost;--v) f[v]=max( f[v],f[v-cost]+weight ); } void CompletePack(int cost,int weight) { for(int v=cost;v<=V;++v) f[v]=max( f[v],f[v-cost]+weight ); } // 多重背包 void MultipPack(int cost,int weight,int amount) { if (cost*amount>=V) { CompletePack(cost,weight); return ; } int k=1 ; while(k<amount) { zero_one_pack(k*cost,k*weight); amount=amount-k; k=k*2; } zero_one_pack(amount*cost,amount*weight); } int main() { while(cin>>V>>num) { memset(f,0,sizeof(f)); for(int i=1;i<=num;++i) { cin>>c[i]>>w[i]; } for(int i=1;i<=num;++i) MultipPack(w[i],w[i],c[i]); cout<<f[V]<<endl; } return 0; }