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