C语言:背包问题(动态规划)

// 背包问题:
// 现有四个物品,背包总量为8,背包最多能装入价值为多少的物品?
// i 物品编号:1  2  3  4 
// w 体积    :2  3  4  5 
// v 价值    :3  4  5  6
#include<stdio.h>
#include<math.h>

int volume[5] = { 0,2,3,4,5 };	// 物品体积
int value[5] = { 0,3,4,5,6 };	// 物品价值
int dp[5][9] = { 0 };			// 动态规划矩阵横坐标为背包容量,纵坐标为物品编号
int object[5] = { 0 };			// 若i物品有装入背包,则object[i]修改为1

// 返回两个值中的的最大值
int max(int a, int b)
{
	if (a > b)
		return a;
	return b;
}

// 动态规划找到背包所能装下的最大价值
void Dynamic()
{
	// 由物品1至4,背包容量由0至8依次考虑
	for (int i = 1; i < 5; i++)
	{
		for (int j = 1; j < 9; j++)
		{
			if (volume[i] > j)
			{
				// 若容量为j的背包本身就装不下第i个物品,则不考虑装入物品i的情况
				// 因此考虑i物品与不考虑i物品的最优值相同
				dp[i][j] = dp[i - 1][j];
			}
			else
			{
				// 若容量为j的背包可以装下第i个物品
				// 则比较i物品不装入背包dp[i - 1][j],与i物品装入背包dp[i - 1][j - volume[i]] + value[i]两种情况
				// 应注意的是,将i物品装入背包时,需预留出i物品的体积volume[i],再考虑体积为j - volume[i],
				// 考虑前i - 1个物品的情况下的最优值,最后再加上i的价值
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);
			}
		}
	}
}

// 回溯找回装了哪些物品
// 从dp[4][8]开始回溯
void Find(int i, int j)
{
	if (i == 0)
		return;
	if (dp[i][j] == dp[i - 1][j]) // 这说明物品i没有被装入背包
	{
		object[i] = 0;
		Find(i - 1, j);	// 递归寻找背包剩余容量为j时,物品i - 1是否被装入背包
	}
	else if (dp[i][j] == dp[i - 1][j - volume[i]] + value[i]) // 这说明物品i有被装入背包
	{
		object[i] = 1;
		Find(i - 1, j - volume[i]); // 递归寻找在背包剩余容量为j - volume[i]时,
									// 物品i - 1是否被装入背包
	}
}

int main()
{
	Dynamic();
    // 从dp[4][8]开始回溯
	Find(4, 8);

	// 打印dp矩阵,横坐标为背包容量,纵坐标为物品编号
	printf("dp矩阵如下:\n");
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			printf("%d ", dp[i][j]);
		}
		printf("\n");
	}
	printf("\n");
	// 打印object矩阵
	printf("object矩阵如下:\n");
	for (int i = 1; i < 5; i++)
	{
		printf("%d ", object[i]);
	}
	return 0;
}

 输出结果如下:

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
01背包问题是一个经典的动态规划问题,它的目标是在给定一组物品和一个背包容量的情况下,选择一些物品放入背包中,使得放入背包的物品总价值最大化,同时不能超过背包的容量限制。 在C语言中,可以使用动态规划算法来解决01背包问题。下面是一个简单的实现示例: ```c #include <stdio.h> // 定义最大物品数量和背包容量 #define MAX_ITEMS 100 #define MAX_CAPACITY 1000 // 定义物品结构体 typedef struct { int weight; // 物品重量 int value; // 物品价值 } Item; // 动态规划函数 int knapsack(int n, int capacity, Item items[]) { int dp[MAX_ITEMS + 1][MAX_CAPACITY + 1] = {0}; // dp数组,用于保存子问题的最优解 // 填充dp数组 for (int i = 1; i <= n; i++) { for (int j = 1; j <= capacity; j++) { if (items[i].weight > j) { dp[i][j] = dp[i - 1][j]; } else { int value_with_item = dp[i - 1][j - items[i].weight] + items[i].value; int value_without_item = dp[i - 1][j]; dp[i][j] = (value_with_item > value_without_item) ? value_with_item : value_without_item; } } } return dp[n][capacity]; // 返回最优解 } int main() { int n; // 物品数量 int capacity; // 背包容量 Item items[MAX_ITEMS + 1]; // 物品数组 // 输入物品数量和背包容量 printf("请输入物品数量:"); scanf("%d", &n); printf("请输入背包容量:"); scanf("%d", &capacity); // 输入每个物品的重量和价值 printf("请依次输入每个物品的重量和价值:\n"); for (int i = 1; i <= n; i++) { printf("物品%d:", i); scanf("%d %d", &items[i].weight, &items[i].value); } // 调用动态规划函数求解最优解 int max_value = knapsack(n, capacity, items); // 输出最优解 printf("背包能装下的最大价值为:%d\n", max_value); return 0; } ``` 以上是一个简单的01背包问题动态规划解法的C语言实现。你可以根据需要修改物品数量、背包容量和每个物品的重量和价值,然后运行程序得到最大价值。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

捕捉一只Diu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值