简单背包问题

题目描述
 简单的背包问题。设有一个背包,可以放入的重量为s。现有n件物品,重量分别为w1,w2…,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。找到一组解即可。


如果找不到,输出"not found"(引号不输出)


输入
第一行是物品总件数和背包的载重量,第二行为各物品的重量。
输出
 各所选物品重量(按编号从小到大顺序输出)
样例输入
5 10
1 2 3 4 5
样例输出
number:1  weight:1
number:4  weight:4

number:5  weight:5

#include<iostream>
using namespace std;
int k(int s,int n,int a[])
{
	if(s==0)
	{
		return (1);
	}
	else
	{
		if(s<0||(s>0&&n<1))
		{
			return (0);
		}
		else
		{
			if(k(s-a[n-1],n-1,a))
				{
					cout<<"number:"<<n<<"  "<<"weight:"<<a[n-1]<<endl;
					return (1);
				}
			else
			{
				return k(s,n-1,a);
			}
		}
	}
		
}
int main()
{
	int S,n,a[100],t;
	cin>>n>>S;
	for(int i=0;i<n;i++)
		cin>>a[i];
		t=k(S,n,a);
		if(t==0)
		cout<<"not found"<<endl;
}


### 背包问题的动态规划实现 简单背包问题是组合优化领域中的经典问题之一,其核心在于通过动态规划的方法来寻找最优解。以下是基于动态规划解决简单背包问题的具体方法。 #### 动态规划的核心思想 动态规划的关键是将复杂问题分解为若干子问题,并记录这些子问题的结果以便后续使用。对于背包问题而言,状态定义通常涉及两个维度:当前考虑的物品集合以及剩余可用容量。具体来说: - **状态表示**:设 `dp[j]` 表示当背包容量为 `j` 时所能获得的最大价值。 - **状态转移方程**:如果第 `i` 件物品的重量为 `w[i]`,价值为 `v[i]`,则有如下关系: \[ dp[j] = \max(dp[j], dp[j-w[i]] + v[i]) \quad (j \geq w[i]) \] 这里的含义是,在处理到第 `i` 件物品时,可以选择不放入该物品(即保持原来的值),或者选择将其放入(此时需要更新最大价值)。[^1] #### C++ 实现代码 下面是一个典型的 0-1 背包问题的非递归实现方式,采用一维数组存储中间结果以节省空间: ```cpp #include <iostream> #include <vector> using namespace std; int knapsack(int W, vector<int> weights, vector<int> values, int n) { // 创建一个大小为W+1的一维数组用于保存不同容量下的最大价值 vector<int> dp(W + 1, 0); for (int i = 0; i < n; ++i) { // 遍历每一件物品 for (int j = W; j >= weights[i]; --j) { // 倒序遍历背包容量 dp[j] = max(dp[j], dp[j - weights[i]] + values[i]); } } return dp[W]; } int main() { int n = 4; int W = 5; vector<int> values = {60, 100, 120, 70}; vector<int> weights = {1, 2, 3, 4}; cout << "Maximum value in the knapsack is: " << knapsack(W, weights, values, n) << endl; return 0; } ``` 上述程序实现了经典的 0-1 背包算法,其中外层循环迭代每一个物品,而内层循环倒序计算每个可能的背包容量下能够达到的最大价值。这种做法可以有效避免重复计算并减少内存消耗。[^4] #### 关键点解析 1. **初始化**:创建长度为 `W+1` 的数组 `dp[]` 并全部赋初值为零,代表没有任何物品的情况下任何容量的价值都为零。 2. **逆向填充**:为了防止同一阶段的数据覆盖影响其他数据,因此在第二层循环中采用了从大到小的方式进行填表操作。 3. **最终结果提取**:经过所有物品的选择过程之后,`dp[W]` 即为我们所求得的最大总价值。 #### 时间与空间复杂度分析 时间复杂度主要由两部分组成——外部针对物品数量 `n` 和内部关于背包容量范围 `[0,W]` 的双重嵌套结构决定,总体上表现为 O(n*W),这正是标准动态规划解决方案的时间开销特征;至于空间方面,则由于只维护了一个线性的辅助数组而非二维表格形式,故实际占用量降到了 O(W) 水平。[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值