#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揹包問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.