01 背包的C实现

#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 循环后面直接加了个;导致调试了一个小时,复习了动态数组的建立,形参的传递!
posted @ 2013-06-05 21:26  爱生活,爱编程  阅读(367)  评论(0编辑  收藏  举报