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)的更多相关文章

  1. 普通01背包问题(dp)

    有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 <= wi,vi & ...

  2. 0-1背包问题-DP

    中文理解: 0-1背包问题:有一个贼在偷窃一家商店时,发现有n件物品,第i件物品价值vi元,重wi磅,此处vi与wi都是整数.他希望带走的东西越值钱越好,但他的背包中至多只能装下W磅的东西,W为一整数 ...

  3. PAT1048. Find Coins(01背包问题动态规划解法)

    问题描述: Eva loves to collect coins from all over the universe, including some other planets like Mars. ...

  4. DP动态规划之01背包问题

    目录 问题描述 问题分析 问题求解 Java代码实现 优化方向一:时间方面:因为是j是整数是跳跃式的,可以选择性的填表. 思考二:处理j(背包容量),w(重量)不为整数的时候,因为j不为整数了,它就没 ...

  5. 01背包问题之2(dp)

    01背包问题之2 有n个物品,重量和价值分别为wi和vi,从这些物品中挑选出重量不超过W的物品,求所有挑选方案中物品价值总和的最大值 限制条件: 1 <= n <= 100; 1 < ...

  6. 01背包问题的延伸即变形 (dp)

    对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值.这次用dp针对不同的 ...

  7. 动态规划(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+ ...

  8. 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 ...

  9. DP:0-1背包问题

    [问题描述] 0-1背包问题:有 N 个物品,物品 i 的重量为整数 wi >=0,价值为整数 vi >=0,背包所能承受的最大重量为整数 C.如果限定每种物品只能选择0个或1个,求可装的 ...

随机推荐

  1. 20200107——记spring的DataSource

    spring项目中总要跟数据库打交道,其中怎么连接数据库的方法都有很多,大概分为3类: 1) 通过JNDI获取应用服务器(如JBOSS, Tomcat) 的数据源 2)  Spring容器中直接配置数 ...

  2. requets中urlencode的问题

    前言 今天团队群里有师傅问requests怎么设置不解码,这里是语误,其实师傅想说的是,如果设置不编码. 一开始我没懂,然后师傅们解答了这个问题后,我想了会儿懂了. 在一些CTF题目中,可能会碰到这样 ...

  3. [复现]GXY2019

    前言 当时GXY的时候在复习中,临时抱拂脚,没时间打比赛.就写了一题./(ㄒoㄒ)/~~ babysqli 当时做了写了笔记. 过滤了or,()其中or可以用大小写绕过,可以用order by盲注 第 ...

  4. [YII2] Activeform表单部分组件使用方法

    文本框:textInput(); 密码框:passwordInput(); 单选框:radio(),radioList(); 复选框:checkbox(),checkboxList(); 下拉框:dr ...

  5. (一)微信小程序:实现引导页

    基本目录结构 index目录下文件操作步骤 1.针对index.wxml <!--index.wxml--> <view class="index-container&qu ...

  6. C# 反射(一)

    刚工作没多久,需要对以往的知识进行复习和巩固.先讲讲最近在公司常用到的反射机制. 反射(Reflection):提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将 ...

  7. python工业互联网监控项目实战4—python opcua

    前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA.OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅 ...

  8. <vector>常用操作

    如果不清楚vector是什么的话就去看我的另一篇随笔吧:https://www.cnblogs.com/buanxu/p/12791785.html 进入正题,vector和string一样,也是一种 ...

  9. tp5.1 依赖注入的使用

    参考:概念:https://blog.csdn.net/qq_36172443/article/details/82667427应用: http://www.cnblogs.com/finalandd ...

  10. 全国315个城市,用python爬取肯德基老爷爷的店面信息

    我觉得我生活在这世上二十多年里,去过最多的餐厅就是肯德基小时候逢生日必去,现在长大了,肯德基成了我的日常零食下班后从门前路过饿了便会进去点分黄金鸡块或者小吃拼盘早上路过,会买杯咖啡.主要快捷美味且饱腹 ...