#include<stdio.h>#include<math.h>#include<stdlib.h>int max(int a ,int b){ return a > b ? a :b;}/* 該函數返回01 背包執行後的F[][]二維數組 @param N 代筆物體的個數 V 背包的容量 c[] 每個物體的消耗的容量 w[] 每個物體的權值 */void pack01(int** F,int* w,int* c,int N,int V){ int i , j; for( i = 0 ; i <= V ;i++) F[0][i]=0; for( i = 0; i <=N ;i++) F[i][0] = 0; for( i = 1;i <= N ;i++) { for( j = 0;j < c[i];j++) F[i][j] = F[i-1][j]; for( j=c[i];j<=V;j++) F[i][j] = max(F[i-1][j],F[i-1][j-c[i]] + w[i]); } /* for(i = 1; i <= N ;i++) { for(j = 0 ; j<=V;j++) { if(j<c[i]) F[i][j] = F[i-1][j]; else F[i][j] = max(F[i-1][j],F[i-1][j-c[i]] + w[i]); } }*/}/* 列印裝入背包的物品 */ void printPack01(int** F ,int* c ,int N ,int V){ printf("begin\n"); int* p = (int*) malloc(sizeof(int)*(N+1)); for(int i = 0;i<=N;i++)p[i] = 0; int k = V; for(int i = N;i > 0;i--) { if(F[i][k] > F[i-1][k]) { p[i] = 1; k-=c[i]; } } for(int i = 0;i <= N;i++) if(p[i]==1) printf("%d ",i); printf("\n"); printf("End\n"); }int main(){ int** F; int *c,*w; // 物品個數和背包容量 // int c[100],w[100]; int N ,V; printf("輸入物品個數和背包容量\n"); scanf("%d%d",&N,&V); // 動態建立二維數組 F = (int**)malloc(sizeof(int*)*(N+1)); for(int i = 0;i < N+1 ;i++) F[i] = (int*)malloc(sizeof(int)*(V+1)); // 動態建w c數組 w = (int*)malloc(sizeof(int)*(N+1)); c = (int*)malloc(sizeof(int)*(N+1)); printf("輸入每個物品的weight:\n"); for(int i = 1 ;i <=N;i++) scanf("%d",&w[i]); printf("輸入每個物品的cost:\n"); for(int i = 1 ;i <=N;i++) scanf("%d",&c[i]); pack01(F,w,c,N,V); printf("背包的最大值:%d\n",F[N][V]); // 列印裝入背包的物品 printPack01(F,c,N,V); system("pause"); return 0; }
不得不吐槽一下,由於for 迴圈後面直接加了個;導致調試了一個小時,複習了動態數組的建立,形參的傳遞!