#include <stdio.h> #include <stdlib.h> int V[200][200];//前i个物品装入容量为j的背包中获得的最大价值 int max(int a,int b) { if(a>=b) return a; else return b; } int KnapSack(int n,int w[],int v[],int x[],int C) { int i,j,o,p; for(i=0;i<=n;i++) V[i][0]=0; for(j=0;j<=C;j++) V[0][j]=0; for(i=0;i<=n-1;i++) for(j=0;j<=C;j++) { printf("----------------------------------\n"); printf("i = %d\n",i); printf("j = %d\n",j); printf("w = %d\n",w[i]); printf("----------------------------------\n"); if(j<w[i] && (i-1) >= 0) { printf("v[%d][%d] = %d\n",i,j,V[i][j]); printf("v[%d - 1][%d] = %d\n",i,j,V[i-1][j]); V[i][j]=V[i-1][j]; } else V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); } j=C; for(i=n-1;i>=0;i--) { if(V[i][j]>V[i-1][j] ) { x[i]=1; j=j-w[i]; } else x[i]=0; } printf("动态规划表如下:\n"); for(o = 0;o<=10;o++) for(p = 0;p <= 10;p++) { printf("%3d",V[o][p]); if(p % 10 == 0 && p != 0) printf("\n"); } printf("选中的物品是:\n"); for(i=0;i<n;i++) printf("%d ",x[i]); printf("\n"); return V[n-1][C]; } void main() { int s;//获得的最大价值 int w[15];//物品的重量 int v[15];//物品的价值 int x[15];//物品的选取状态 int n,i; int C;//背包最大容量 n=5; printf("请输入背包的最大容量:\n"); scanf("%d",&C); printf("输入物品数:\n"); scanf("%d",&n); printf("请分别输入物品的重量:\n"); for(i=0;i<n;i++) scanf("%d",&w[i]); printf("请分别输入物品的价值:\n"); for(i=0;i<n;i++) scanf("%d",&v[i]); s=KnapSack(n,w,v,x,C); printf("最大物品价值为:\n"); printf("%d\n",s); }
基于C的动态规划0-1背包问题
猜你喜欢
转载自blog.csdn.net/jianyuling199/article/details/17483957
今日推荐
周排行