背包问题(c++)

该博客主要探讨了如何使用动态规划求解经典的0-1背包问题。通过一个包含5件物品和9单位容量的背包为例,展示了动态规划算法的实现过程,计算每个物品选择或不选择时的最大价值。最后,程序输出了在给定背包容量下能获得的最大价值。

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


#include<iostream>
#include<algorithm>
using namespace std;
int f[5][9] = { 0 };
int w[5] = { 0,2,3,4,5 };//物品重量
int v[5] = { 0,3,4,5,8 };//物品价值
int main() {
	//v=f(i,w)函数关系 i是能选的前几件物品 w是背包容量 v是总价值
	for (int i = 1; i < 5; i++)//物品序号
	{
		for (int j = 1; j < 9; j++)//背包容量
		{
			if(j<w[i])
			{
				f[i][j] = f[i - 1][j];
			}
			else 
			{
				f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
			}
		}
	}
	int max = f[0][0];
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			if (f[i][j] >= max)
				max=f[i][j];
			//cout << f[i][j] << " ";
		}
		
	}
	cout << max;
	return 0;
}


 

好的,让我为你解释一下经典的01背包问题,并提供一个简单的C++实现。 ### 什么是01背包问题? **01 背包问题是组合优化的一个经典例子。** 给定一组物品和一个容量有限的背包,每个物品都有一定的重量和价值,在限定总重量的情况下选择最的价值装入背包。这里的“01”意味着对于每一个物品来说只有两个选项——要么放入背包,要么不放。 #### 解决思路 最直接的方法就是尝试所有可能性并记录最优解;然而当物品数量较时这种方法效率极低。因此我们通常采用动态规划算法解决此问题: 1. 创建二维数组`dp[i][j]`表示前i件商品在不超过容积为j的情况下的最大价值; 2. 对于每一件新加入的商品k,如果其体积v_k小于等于当前考虑的最大容积,则更新公式: - `dp[k][w]=max(dp[k−1][w], dp[k−1][w-v_k]+p_k)` 其中p_k代表第K个物体的价格。 下面是基于上述思想的一段简单 C++ 实现: ```cpp #include <iostream> using namespace std; const int MAXW = 50; // 最大承重设为常量方便修改 int weight[] = {4,7,5}; // 物品质量数组 int value []= {10,20,30}; // 物品价值数组 int n = sizeof(weight)/sizeof(int); // 物品种数n int W = 11 ;// 总承受力 void knapsack() { int i,j; int V[MAXW+1]; // 动态规划表 for (i = 0; i <= W; ++i) V[i] = 0; // 初始化表格 for(i=0;i<n;++i) for(j=W;j>=weight[i];--j){ if(V[j]<V[j-weight[i]] +value[i]) V[j]=V[j-weight[i]] +value[i]; } cout << "最高价值:" << V[W]<< endl ; } int main(){ knapsack(); return 0;} ``` 请注意这只是一个简化版本用于说明原理,实际应用可能需要更复杂的边界条件检查等处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值