博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01背包问题,dp和贪心解法(c++11)
阅读量:4510 次
发布时间:2019-06-08

本文共 1916 字,大约阅读时间需要 6 分钟。

dp解法:

令dp[i]表示容量为i的背包所能得到的最大价值,考虑在当前物品集合中加入1个新考虑的物品i,则有如下状态转移方程:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

#include 
using namespace std;const int M = 1e4;typedef pair
> piv;struct Node { int weight, value; int id; void read() { cin >> weight >> value; } void solve(piv dp[], int M) { for (int i = M; i >= weight; i --) { if (dp[i - weight].first + value > dp[i].first) { dp[i].first = dp[i - weight].first + value; dp[i].second = dp[i - weight].second; dp[i].second.push_back(id); } } }};int n, m;piv dp[M];int main() { puts("请输入背包容量和物品个数:"); cin >> m >> n; puts("请输入每个背包的重量(体积)和价值"); Node things; for (int i = 0; i < n; i ++) { things.read(); things.id = i + 1; things.solve(dp, m); } cout << "最大价值为:" << dp[m].first << endl; puts("选择的物品编号:"); for (int i = 0; i < dp[m].second.size(); i ++) { cout << dp[m].second[i] << " "; } cout << endl; return 0;}

贪心解法:

按部分背包的贪心策略,优先考虑单位价值高的物品,于是只需要按单位价值从高到低排序,然后依次考虑,能放则放即可。

#include 
using namespace std;const int N = 1e2;struct Node { int weight, value; int id; void read() { cin >> weight >> value; } // 单位价值高的放前面 bool operator< (const Node &that) const { return value * that.weight > that.value * weight; }};Node things[N];int n, m;int main() { puts("请输入背包容量和物品个数:"); cin >> m >> n; puts("请输入每个背包的重量(体积)和价值"); for (int i = 0; i < n; i ++) { things[i].read(); things[i].id = i + 1; } sort(things, things + n); int ans = 0; vector
V; for (int i = 0; i < n; i ++) { if (m >= things[i].weight) { ans += things[i].value; m -= things[i].weight; V.push_back(things[i].id); } } cout << "最大价值为:" << ans << endl; puts("选择的物品编号为:"); for (int i = 0; i < V.size(); i ++) { cout << V[i] << " "; } cout << endl; return 0;}

  

转载于:https://www.cnblogs.com/jklongint/p/4921492.html

你可能感兴趣的文章
codeforces 578c - weekness and poorness - 三分
查看>>
数值微分方程
查看>>
动态规划--电路布线(circuit layout)
查看>>
描边时消除锯齿SetSmoothingMode
查看>>
15回文相关问题
查看>>
将VS2013项目转成VS2010项目的方法
查看>>
[置顶] 怎么对待重复的代码
查看>>
多种方法实现H5网页图片动画效果;
查看>>
Ubuntu/CentOS下使用脚本自动安装 Docker
查看>>
源码解读Mybatis List列表In查询实现的注意事项
查看>>
POJ 2311 Cutting Game(二维SG+Multi-Nim)
查看>>
1978 Fibonacci数列 3
查看>>
1225 八数码难题
查看>>
C#控件的闪烁问题解决方法总结
查看>>
js 冒泡事件与解决冒泡事件
查看>>
2018-2019赛季多校联合新生训练赛第七场(2018/12/16)补题题解
查看>>
后台全选功能以及数据的提交方法
查看>>
Android 动画效果 及 自定义动画
查看>>
const与#define相比有什么不同?
查看>>
Eclipse4.7 SpringIDE插件的安装
查看>>