01背包问题,dp和贪心解法(c++11)
dp解法:
令dp[i]表示容量为i的背包所能得到的最大价值,考虑在当前物品集合中加入1个新考虑的物品i,则有如下状态转移方程:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
#include <bits/stdc++.h>
using namespace std; const int M = 1e4;
typedef pair<int, vector<int> > 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 <bits/stdc++.h>
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<int> 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;
}
01背包问题,dp和贪心解法(c++11)的更多相关文章
- 普通01背包问题(dp)
有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 <= wi,vi & ...
- 0-1背包问题-DP
中文理解: 0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数.他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数 ...
- PAT1048. Find Coins(01背包问题动态规划解法)
问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...
- DP动态规划之01背包问题
目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没 ...
- 01背包问题之2(dp)
01背包问题之2 有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 < ...
- 01背包问题的延伸即变形 (dp)
对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值.这次用dp针对不同的 ...
- 动态规划(DP),0-1背包问题
题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+ ...
- PAT 甲级 1068 Find More Coins (30 分) (dp,01背包问题记录最佳选择方案)***
1068 Find More Coins (30 分) Eva loves to collect coins from all over the universe, including some ...
- DP:0-1背包问题
[问题描述] 0-1背包问题:有 N 个物品,物品 i 的重量为整数 wi >=0,价值为整数 vi >=0,背包所能承受的最大重量为整数 C.如果限定每种物品只能选择0个或1个,求可装的 ...
随机推荐
- mybatis一级缓存让我憔悴
Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...
- [YII2] 自带分页调整
在search Model的search()方法里有一个$dataProvider 属性 ,在这个属性数组里添加 'pagination' => ['pageSize' => 10,],设 ...
- SringMVC入门程序
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架 1.Spring优点 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼 ...
- 负载均衡服务之HAProxy基础配置(二)
前文我们聊了下haproxy的global配置段中的常用参数的说明以及使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12763245.html:今天我们来 ...
- kubernetes的headless service介绍
headless service是一个特殊的ClusterIP类service,这种service创建时不指定clusterIP(--cluster-ip=None),因为这点,kube-proxy不 ...
- MySQL之唯一索引、外键的变种、SQL语句数据行操作补充
0.唯一索引 unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称 上面为联合索引:num和xx不能完全一样 1.外键的变种 a. 用户表和部门表 用户: 1 alex 1 ...
- go获取当前项目下所有依赖包
在设置好GOPATH,GOROOT的环境变量的情况下. 在项目配置好pkg.bin.src等这几个目录的情况,进入src目录. 在终端,输入:go get ./... 即可获得所有依赖包.
- 动静结合?Ruby 和 Java 的基础语法比较(入门篇)
前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...
- [Qt] QProcess::startDetached() 避免弹窗,或者窗口一闪而过
主动宣告setProcessState(QProcess::NotRunning) 或者在堆上new一个QProcess. 出处: https://stackoverflow.com/q ...
- 【java基础】01 计算机基础知识
一.计算机基础知识 1. 计算机 1. 什么是计算机? 计算机在生活中的应用举例 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设 ...