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个,求可装的 ...
随机推荐
- Java核心技术--接口与内部类
接口implement 继承接口,即履行"义务". 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public 接口中决不能含有实例域,也不能在接口中实现方法 ...
- python3 xlwt,csv学习
前言 对于抓取一些站点分析然后指纹识别的时候可能用到到它.所以学习下.这里就记录一些最基本的感觉有用的. xlwt 基本创建 demo: #coding=utf- import xlwt yunyin ...
- python 中自带的堆模块heapq
import heapq my_heap = [] #使用列表保存数据 #网列表中插入数据,优先级使用插入的内容来表示,就是一个比较大小的操作,越大优先级越高 heapq.heappush(my_he ...
- JS 获取浏览器
function getInfo() { var s = ""; s = " 网页可见区域宽:" document.body.clientWidth; s = ...
- [Inno Setup] How to create a OuterNotebook/welcome page in the uninstaller
By Martin Prikryl https://stackoverflow.com/questions/42625626/inno-setup-how-to-create-a-outernoteb ...
- POJ1651:Multiplication Puzzle(区间dp)
Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...
- Ubuntu下访问Windows中Postgresql
因为项目的原因,需要将Ubuntu中的一些信息记录到Windows中的Postgresql数据库中,查看网上信息,最后成功了,特地记录以下,需要以下步骤: (1)在Windows中Postgresql ...
- 怎样借助Python爬虫给宝宝起个好名字
每个人一生中都会遇到一件事情,在事情出现之前不会关心,但是事情一旦来临就发现它极其重要,并且需要在很短的时间内做出重大决定,那就是给自己的新生宝宝起个名字.因为要在孩子出生后两周内起个名字(需要办理出 ...
- 高可用性GRE+IPSEC中心—分支
在实际网络运用中我们时常跑GRE+IPSEC来实现我们中心到分支的远程访问回话,这样以来容易配置,而来可用性高,我们知道L2L无论是链路备份还是设备备份,都不是状态备份,当一个点断掉后,用经过几十秒甚 ...
- Ubuntu 14.04 配置samba
Ubuntu 14.04 配置samba: 安装略 # vi /etc/samba/smb.conf security = user (在[global]下任意添加) [share] path = ...