- #include
- using
namespace std; - int
c[10][100]; - int
Knapsack(int n,int m) - {
-
int i,j; -
int w[10],v[10]; -
for(i=1;i<=n;i++) -
scanf("%d%d",&w[i],&v[i]); -
for(i=0;i<10;i++) -
for(j=0;j<100;j++) -
c[i][j]=0; -
for(i=1;i<=n;i++) -
for(j=1;j<=m;j++) -
{ -
if(w[i]<=j) -
{ -
-
if(c[i-1][j] -
c[i][j]=v[i]+c[i-1][j-w[i]]; -
else//否则不更新 -
c[i][j]=c[i-1][j]; -
} -
else -
c[i][j]=c[i-1][j]; -
} -
return c[n][m]; - }
- int
main() - {
-
int n,m; -
printf("input m and n/n"); -
scanf("%d%d",&m,&n); -
printf("%d",Knapsack(n,m)); -
printf("/n"); -
int i,j; -
for(i=0;i<=n;i++) -
{ -
for(j=0;j<=m;j++) -
printf("=",c[i][j]); -
printf("/n"); -
} -
return 0; - }
-
上面的算法没有提供找最优解序列的方法,下面给出找最有解序列的代码
- #include
- using
namespace std; - int
c[10][100]; - int
x[10];//存放最优解 - int
Knapsack(int n,int m,int w[],int v[]) - {
-
int i,j; -
for(i=0;i<10;i++) -
for(j=0;j<100;j++) -
c[i][j]=0; -
for(i=1;i<=n;i++) -
for(j=1;j<=m;j++) -
{ -
if(w[i]<=j) -
{ -
-
if(c[i-1][j] -
{ -
c[i][j]=v[i]+c[i-1][j-w[i]]; -
} -
else//否则不更新 -
{ -
c[i][j]=c[i-1][j]; -
} -
} -
else -
{ -
c[i][j]=c[i-1][j]; -
} -
} -
return c[n][m];//矩阵的最后一个为最优解。 - }
-
- void
Trackback(int c[][100],int w[],int m,int n) - {
-
int i; -
for(i=n;i>0;i--) -
{ -
if(c[i][m]==c[i-1][m])//表示序号为i的物品没有被装入背包 -
x[i]=0; -
else -
{ -
x[i]=1; -
m-=w[i]; -
} -
} - }
-
- int
main() - {
-
int n,m; -
int i,j; -
printf("input m and n/n"); -
scanf("%d%d",&m,&n); -
int w[10],v[10]; -
for(i=1;i<=n;i++) -
scanf("%d%d",&w[i],&v[i]); -
-
printf("%d",Knapsack(n,m,w,v)); -
printf("/n"); -
-
for(i=0;i<=n;i++) -
{ -
for(j=0;j<=m;j++) -
printf("=",c[i][j]); -
printf("/n"); -
} -
Trackback(c,w,m,n);//找最优解 -
for(i=1;i<=n;i++) -
cout<<x[i]<<" "; -
cout<<endl; -
return 0; - }
-