#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 循环后面直接加了个;导致调试了一个小时,复习了动态数组的建立,形参的传递!