您的位置:首页 > 其它

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

2009-04-20 20:29 471 查看
/*
*作者: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
)+P(n,v)}分别保存1...n,1,...v中maxvalue[i][j]最大价值,最后求得maxvalue
[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
[v]);

}
void destory(void)
{
int j;
for(j=0;j<v+1;j++)
free(maxvalue[j
]);
free(maxvalue);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: