01 背包的C实现

来源:互联网 发布:心动网络 ceo 编辑:程序博客网 时间:2024/06/05 21:17
#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 循环后面直接加了个;导致调试了一个小时,复习了动态数组的建立,形参的传递!	
				
		
原创粉丝点击