动态规划-0-1背包问题(C语言)

该篇文章详细介绍了如何用C语言实现0-1背包问题,包括结构体定义物品属性、求背包的最大价值函数KnapSack以及输出装入背包的物品信息。通过实例展示了如何解决背包容量限制下的物品选择问题。
摘要由CSDN通过智能技术生成
#include<stdio.h>
 
/*结构体 定义物品*/
struct Goods
{
	int id;				//物品编号
	int in_not_bag;		//物品是否在背包中,1表示在,0表示不在
	int weight;			//物品重量
	int value;			//物品价值
}goods[55];             //定义最大物品数量
 
 
/*输出物品信息*/
void PrintInfo(struct Goods goods[55],int n)
{
	int i=0;
    printf("*****************************************************\n");
	printf("您输入的物品信息如下:\n");
   	printf("\n物品ID\t重量\t价值\n");
		for(i=0;i<n;i++)
		{
			printf("%d\t%d\t%d\n",goods[i].id,goods[i].weight,goods[i].value);
		}
}
 
 
/*求背包的最大价值*/
int KnapSack(struct Goods goods[55] ,int n,int C)
{
	int i,j;
	int V[55][55]={0};
	//初始化0列
	for(i=0;i<=n;i++)	
	{
		V[i][0]=0;
	}
	//初始化0行
	for(j=0;j<=C;j++)	
	{
		V[0][j]=0;
	}
	//计算每一行
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=C;j++)
		{
			if(j<goods[i-1].weight) //如果物品重量大于背包重量,则不能放入
				V[i][j]=V[i-1][j];
			else					//如果物品重量小于等于背包重量
			{
                V[i][j]=(V[i-1][j]>V[i-1][j-goods[i-1].weight]+goods[i-1].value)?V[i-1][j]:V[i-1][j-goods[i-1].weight]+goods[i-1].value;
			}
		}
	}
	//求出装入背包中的物品
    for(j=C,i=n;i>0;i--)
	{
         if(V[i][j]>V[i-1][j])
		 {
			 goods[i-1].in_not_bag=1;
			 j=j-goods[i-1].weight;
		 }
		 else
		 {
			 goods[i-1].in_not_bag=0;
		 }
	}
	//输出计算过程
	printf("*****************************************************\n");
	printf("计算过程如下:\n");
	for(i=0;i<=n;i++)
	{
		for(j=0;j<=C;j++)
			printf("%3d",V[i][j]);
		printf("\n");
	}
	//返回背包所求最大价值
	return V[n][C];
}
 
 
/*输出装入背包中的物品信息*/
void IsInBagInfo(struct Goods goods[55],int n)
{
	int i=0;
	printf("*****************************************************\n");
	printf("装入背包中的物品为:\n");
	printf("物品ID\t重量\t价值\n");
	for(i=0;i<n;i++)
		{
			if(goods[i].in_not_bag==1)
				printf("%d\t%d\t%d\n",goods[i].id,goods[i].weight,goods[i].value);
		}
}


int main()
{
	int i;
	int cpc;		//背包容量
	int goods_number;	//物品个数
	int max_value;		//最大价值
    /*输入背包容量、物品个数、重量以及价值*/
	printf("请输入背包容量:");
	while(scanf("%d",&cpc) != EOF)
	{	
        printf("请输入存放物品个数:");
		scanf("%d",&goods_number);
		while(goods_number > 55)
		{
			printf("抱歉,当前所容许最大物品数量为55,请您重新输入");
			scanf("%d",&goods_number);
		}
        printf("请输入%d个物品的重量分别为(空格隔开):",goods_number);
		for(i=0;i<goods_number;i++)
		{
			goods[i].id=i+1;
			goods[i].in_not_bag=0;//默认表示当前物品不在背包
			scanf("%d",&goods[i].weight);
		}
		printf("请输入%d个物品的价值分别为(空格隔开):",goods_number);
		for(i=0;i<goods_number;i++)
		{
            scanf("%d",&goods[i].value);
		}
		/*输出物品信息*/
		PrintInfo(goods,goods_number);
		/*求背包的最大价值*/
		max_value=KnapSack(goods,goods_number,cpc);
	    /*输出装入背包中的物品信息*/
	    IsInBagInfo(goods,goods_number);
		/*输出最大价值*/
		printf("\n最大价值为%d",max_value);
		/*继续新的计算*/
		printf("\n\n\n请输入背包容量");
	}
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值