#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;
}
动态规划-0-1背包问题(C语言)
该篇文章详细介绍了如何用C语言实现0-1背包问题,包括结构体定义物品属性、求背包的最大价值函数KnapSack以及输出装入背包的物品信息。通过实例展示了如何解决背包容量限制下的物品选择问题。
摘要由CSDN通过智能技术生成