动态规划(背包问题)c++代码实现

本文详细介绍了数据结构的基础知识,包括数组、链表、栈和队列等,并深入探讨了排序算法,如快速排序、归并排序和堆排序的原理与实现。同时,文章还分享了在实际项目中如何应用这些知识,帮助读者提升算法理解和应用能力。
摘要由CSDN通过智能技术生成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 01 背包问题动态规划实现,用 C++ 编写: ```c++ #include <iostream> #include <vector> using namespace std; int knapsack(int W, vector<int> wt, vector<int> val, int n) { vector<vector<int>> dp(n+1, vector<int>(W+1, 0)); for (int i = 1; i <= n; i++) { for (int w = 1; w <= W; w++) { if (wt[i-1] <= w) { dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]); } else { dp[i][w] = dp[i-1][w]; } } } return dp[n][W]; } int main() { int W = 50; vector<int> wt = {10, 20, 30}; vector<int> val = {60, 100, 120}; int n = wt.size(); cout << knapsack(W, wt, val, n) << endl; return 0; } ``` 以上代码中,`knapsack` 函数实现了 01 背包问题动态规划解法,接受背包的容量 `W`、物品重量 `wt`、物品价值 `val` 和物品数量 `n` 作为输入,返回能够装入背包的最大价值。 具体来说,我们可以使用一个二维数组 `dp` 来存储解决子问题的结果。`dp[i][w]` 表示前 `i` 个物品,容量为 `w` 的背包最多能装多少价值的物品。 状态转移方程为: ``` dp[i][w] = max(val[i-1] + dp[i-1][w-wt[i-1]], dp[i-1][w]) ``` 其中,`i` 表示当前考虑到的物品编号,`w` 表示当前背包的容量。如果当前物品的重量小于等于当前背包的容量,我们可以选择将当前物品放入背包,也可以选择不放入。如果选择放入,则背包的剩余容量为 `w-wt[i-1]`,此时可以装入的最大价值为 `val[i-1] + dp[i-1][w-wt[i-1]]`;如果选择不放入,则背包的容量不变,此时可以装入的最大价值为 `dp[i-1][w]`。我们在两种情况中取较大值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值