01背包问题---C源程序

/*
 *作者:breezes
 *日期:19:57 2009-4-20
 *描述:01背包问题求解
 */
#include "stdio.h"
#include "malloc.h"
#define DEBUG 0 
void init(void);
void deal(void);
void show(void);
void destory(void);

/*id,value,weight分别表示物品的号码连城、价值、重量*/
struct package{
 int id,value,weight;
};
struct package *knapsack;
int **maxvalue;  /*maxvalue[i][j]表示有i个物品能装入载重量为j的背包中物品的最大价值*/
/*f(n,v)=max{f(n-1,v), f(n-1,v-w[n])+P(n,v)}分别保存1...n,1,...v中maxvalue[i][j]最大价值,最后求得maxvalue[n][v]*/
int n,v;  /*n表示物品总数量,v表示最大负载量*/
main()
{


  
 init(); 
 deal();
 show();
 getch();
 destory();
}

void init(void)
{

 int i,j;
 printf("input (n,v):");
 scanf("%d,%d",&n,&v);
 if(n<1|| v<1)
 {
  printf("n<=0 or v<=0,error!/n");
  exit(0);
 }
 /*
  *动态分配二维数组
   */
 maxvalue=(int **)malloc((n+1)*sizeof(int *));
 for(i=0;i<v+1;i++)
 maxvalue[i] =(int *)malloc((v+1)*sizeof(int));

 for(i=0;i<n+1;i++)
 for(j=0;j<v+1;j++)
 *(*(maxvalue+i)+j)=0;


 knapsack=(struct package *)malloc(sizeof(struct package)*n);
 if(!knapsack) {printf("cannot get memory for dnapsack.");exit(0);} 
 printf("input (id,value,weight):/n");
 for(i=0;i<n;i++)
 {
  scanf("%d,%d,%d",&knapsack[i].id,&knapsack[i].value,&knapsack[i].weight);
 }
 
 #if DEBUG
 printf("show initialized maxvalue:/n");
 for(i=0;i<n+1;i++)
 {
  for(j=0;j<v+1;j++)
  printf("%d ",*(*(maxvalue+i)+j));
 printf("/n");
 }
 printf("show initialized knapsack:/n");
 for(i=0;i<n;i++) 
 printf("%d,%d,%d/n",knapsack[i].id,knapsack[i].value,knapsack[i].weight);
 #endif
}


void deal(void)

 int i,j,temp;
 for(i=1;i<=n;i++)
 {
  for(j=1;j<=v;j++)
  {
   maxvalue[i][j]=maxvalue[i-1][j]; 
   if(knapsack[i-1].weight<=j)
   {
    temp=maxvalue[i-1][j-knapsack[i-1].weight]+knapsack[i-1].value;
    if(temp>maxvalue[i][j])
    maxvalue[i][j]=temp;
   }
  }
 }
}   

void show()
{
 int i,j;
 #if DEBUG
 for(i=0;i<n+1;i++)
 {
  for(j=0;j<v+1;j++)
  printf("%d ",*(*(maxvalue+i)+j));
 printf("/n");
 }
 #endif
 printf("/n>>the knapsack should contain:/n/n");
 printf(">>");
 for(i=n,j=v;i>=1;i--)
 /*如果 maxvalue[i][j]>maxvalue[i-1][j],那么表示第i件物品是选择的*/
 if(maxvalue[i][j]>maxvalue[i-1][j])
 {
  printf("%d  ",knapsack[i-1].id);
  j=v-knapsack[i-1].weight;
 }
 printf("/n/n");
 printf(">>the max value is:%d/n",maxvalue[n][v]);
 
}
void destory(void)
{
 int j;
 for(j=0;j<v+1;j++)
 free(maxvalue[j
 ]);
 free(maxvalue);
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值