基於C的動態規劃0-1揹包問題

#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);




 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章