简单背包问题

1、简单背包问题:

递归:

var flag bool
var W = make([]int,40)

func dfs(s int,n int)(bool){
	if s==0 {
		return true
	}
	if s<0 || (s>0 && n<1){
		return false
	}
	if dfs(s-W[n],n-1) {
		fmt.Print(W[n]," ")
		return true
	}
	return dfs(s,n-1)
}

//简单背包
func main(){
	var S,N int
	fmt.Scan(&S,&N)
	for i:=1;i<=N;i++ {
		fmt.Scan(&W[i])
	}
	if !dfs(S,N) {
		fmt.Println("Failed")
	}
}

枚举,二进制枚举所有情况,符合就输出。

var flag bool
var W = make([]int,40)

func main(){
	var N,i,j uint
	var S,sum,flag int
	fmt.Scan(&S,&N)
	for i=0;i<N;i++ {
		fmt.Scan(&W[i])
	}
	for i:=0;i<(1<<N);i++ {
		sum=0
		for j=0; j<N; j++ {
			if  i &(1 << j)!=0 {
				sum += W[j]
			}
		}
		if sum == S {
			fmt.Printf("%b",i)
			flag = 1
			break
		}
	}
	if flag == 0 {
		fmt.Println("failed")
	}
}

### 背包问题的动态规划实现 简单背包问题是组合优化领域中的经典问题之一,其核心在于通过动态规划的方法来寻找最优解。以下是基于动态规划解决简单背包问题的具体方法。 #### 动态规划的核心思想 动态规划的关键是将复杂问题分解为若干子问题,并记录这些子问题的结果以便后续使用。对于背包问题而言,状态定义通常涉及两个维度:当前考虑的物品集合以及剩余可用容量。具体来说: - **状态表示**:设 `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、付费专栏及课程。

余额充值