参考书本 背包问题

该博客介绍了一个使用动态规划解决01背包问题的C语言实现。程序首先定义了物品的单价、重量和是否超出承载量的判断函数,然后通过递归的knap_1和knap_2函数找到装包的最高价值量,并在不超载的情况下打印所选物品的详细信息。用户可以输入物品数量、重量、价格和背包最大承重,程序会输出最大价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int x[100] = { 0 };     //数组X用来存放路径

int val[100] = { -1 };//物品单价
int weight[100] = { -1 };//存放物品的重量


int isOverLoad(int n, int c)
{
	int i, w = 0;
	for (i = 0; i < n; i++)
		w = w + x[i] * weight[i];
	if (w>c)return 1;
	else return 0;
}

int getVal(int n)
{
	int i, v = 0;
	for (i = 0; i < n; i++)
		v = v + x[i] * val[i];
	return v;
}


void  knap_1(int n, int flag, int c, int *price)//找到物品装包的最高价值量
{           //标记0开始  //背包数量   C最大中量   价格
	int i, j, p;
	if (isOverLoad(n, c))   //剪纸
		return;
	if (n == flag)
	{
		p = getVal(n);
		if (*price < p)
			*price = p;
		return;
	}
	for (i = 0; i <= 1; i++)
	{
		x[n] = i;
		knap_1(n + 1, flag, c, price);
	}


}

void knap_2(int n, int flag, int c,int price)
{
	int i, j, p;
	
	if (isOverLoad(n, c))return;
	if (n == flag)
	{
		p = getVal(n);
		if (price == p)
		{
			printf("---------bag----------\n");
			for (j = 0; j < n; j++)
			
				if (x[j] == 1)
				{
					printf("|   | p %d:        |   |\n",j);
					printf("|   |weight:%2d kg|   |\n", weight[j]);
					printf("|   |price: %2d $ |   |\n\n", val[j]);
				}
				printf("----------------------\n\n");
				getchar();
				return;
			
		}
		return;
	}
	for (i = 0; i <= 1; i++)
	{
		x[n] = i;
		knap_2(n + 1, flag, c, price);
	}
}

void main2222()
{
	int price = 0, n, c, i;
	printf("iNPUT THE nmber of products\n");
	
	scanf("%d",&n);

	printf("Input the weight of each product\n");
	for (i = 0; i < n; i++)
		scanf("%d",&weight[i]);
	printf("Input the price of each product\n");
	for (i = 0; i < n; i++)
		scanf("%d",&val[i]);
	printf("Input the limit weight the bag can overload\n");
	scanf("%d",&c);
	knap_1(0, n, c, &price);
	knap_2(0,n,c,price);
	printf("The grass price : %d $",price);
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值