参考了一圈,我觉得我的是挺容易看懂的,但是时间复杂度高。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int M,N,i,j,k,c[30],w[30],f[30][200],min1=999;//两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
cin>>M;
cin>>N;
memset(f,0,sizeof(f));//数组全部置0
for( i=1;i<=N;i++)//第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
cin>>w[i]>>c[i];
for( i=1;i<=N;i++)
{
min1=min(min1,w[i]);}//找出最小的重量
for(i=1;i<=N;i++){
for(j=M;j>=0;j--){
for(k=0;k<=j/w[i];k++){
if(j<min1) f[i][j]=0;//当剩余的重量小于物品最小重量时,为0
f[i][j]=max(max(f[i][j],f[i-1][j]),f[i-1][j-k*w[i]]+k*c[i]);//比较两次大小
}
}
}
cout<<"max="<<f[N][M]<<endl;
}