动态规划法改进:用序偶法求0/1背包问题

1、问题

2、方法

3、实现代码

序偶法求0/1背包问题(动态规划法改进版) by 孙琨SealSun at UCAS 2015.11.20
#include<iostream>
using namespace std;
#define MAX 256void Knapsack(int n,int c,int v[],int w[],int p[][MAX],int x[]); // 求最优值
void Traceback(int n,int w[],int v[],int p[][MAX],int *head,int x[]); // 求最优解 void Knapsack(int n,int c,int v[],int w[],int p[][MAX],int x[]){int *head = new int[n+2];head[n+1] = 0;p[0][0] = 0;p[0][1] = 0;int left = 0,right = 0,next = 1;head[n] = 1;for(int i=n; i>=1; i--){ // 整体 int k = left;for(int j=left; j<=right; j++){ // 某一段 if(p[j][0]+w[i]>c){break;}int y = p[j][0]+w[i];int m = p[j][1]+v[i];while(k<=right && p[k][0]<y){ // 平整段 p[next][0] = p[k][0];p[next++][1] = p[k++][1];}if(k<=right && p[k][0]==y){ // 跃升点 if(m<p[k][1]){m = p[k][1];}k++;}if(m>p[next-1][1]){p[next][0] = y;p[next++][1] = m;}while(k<=right && p[k][1]<=p[next-1][1]){k++;}}while(k<=right){p[next][0] = p[k][0];p[next++][1] = p[k++][1];}left = right+1;right = next-1;head[i-1] = next;}Traceback(n,w,v,p,head,x);cout << "最大物品价值为:" <<endl;cout << p[next-1][1]<<endl;
}void Traceback(int n,int w[],int v[],int p[][MAX],int *head,int x[]){int j = p[head[0]-1][0];int m = p[head[0]-1][1];for(int i=1; i<=n; i++){x[i] = 0;for(int k=head[i+1];k<=head[i]-1;k++){ if(p[k][0]+w[i]==j && p[k][1]+v[i]==m){ // 若值已存入,则此代表物品已被选中,选中为1 x[i] = 1; j = p[k][0];m = p[k][1];break;}}}cout << "选中的物品是:"<<endl; cout << "第" ; for(int i=1; i<=n; i++){if(x[i] == 1){cout << i << " ";}}cout << "件物品" << endl;
}// 测试用例
int main(){int n; // 物品数 int c; // 背包容量 int w[MAX]; // 各物品的重量 int v[MAX]; // 各物品的价值 int p[MAX][MAX]={0}; // 保存的当前最大价值,p[][1]为当前最优值 int x[MAX]={0}; // 最优解 cout << "请输入背包的最大容量:"<<endl;cin >> c; cout << "请输入物品的个数:"<<endl; cin >> n;cout << "请分别输入物品的重量:"<<endl; for(int i=1; i<=n; i++){cin >> w[i];}cout << "请分别输入物品的价值:"<<endl; for(int i=1; i<=n;i++){cin >> v[i];}Knapsack(n,c,v,w,p,x);    return 0;
}

4、结果截图

动态规划法改进:用序偶法求0/1背包问题相关推荐

  1. 分枝限界法求解0/1背包问题

    问题描述 有n个重量分别为{w1,w2,-,wn}的物品,它们的价值分别为{v1,v2,-,vn},给定一个容量为W的背包. 设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么不选中 ...

  2. 分枝定界法解0/1背包问题

    分枝定界法解0/1背包问题 关键词:分支定界.0-1背包 分枝定界法简介 分枝定界法按照树形结构来组织解空间,展开节点后,有两种策略: 策略一.把节点加入 FIFO 队列当中: 策略二.把节点加入到堆 ...

  3. 回溯法 —— 求解0/1背包问题(剪枝)

    0/1背包问题 题目描述: 有n个重量分别为w1,w2,-,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,-,vn,给定一个容量为W的背包.设计从这些物品中选取一部分物品放入该背包的方案 ...

  4. 动态规划算法据序偶原理求解0/1背包问题(C++实现)

    可程序根据序偶原理,应用动态规划算法求解. Code   1//说明:本程序有一定代码冗余,若分割为多个函数的形式会使程序简洁明了.   2#include <iostream>   3u ...

  5. 0/1背包问题(蛮力法)

    问题描述: 给定n个重量为{w1,w2,w3,....,wn}.价值为{v1,v2,v3,...,vn}的物品和一个容量为C的背包,0/1背包问题是求解这些物品中的一个最有价值的子集,并且要能够装到背 ...

  6. 0.618法C语言编程,c语言编程题--0.618法求最小值

    c语言编程题--0.618法求最小值0 题目: 1.函数f(x)=x+10/x,初始量a=2,b=10,c=0.3 2.步骤:(1)取a1=a+0.382*(b-a),b1=b+0.618*(b-a) ...

  7. 用2分法求下面方程在( - 10, 10)之间的根2 * x*x*x - 4 * x*x + 3 * x - 6 = 0

    题目 本题是谭浩强<c语言程序设计>第五章第十五题 题目:用2分法求下面方程在( - 10, 10)之间的根: 2 * xxx - 4 * x*x + 3 * x - 6 = 0; 提示: ...

  8. 弦截法c语言求方程XeX-1=0的解,编程用弦截法求方程 f(x)=3x^3-5x^2+16x-60=0的根

    满意答案 w6297281 2013.08.26 采纳率:52%    等级:12 已帮助:8785人 希望下面的资料对你有帮助: 弦截法求方程的根是一种解方程得基本方法,在计算机编程中常用.他的思路 ...

  9. C语言:用弦截法求方程 f(x)=x3-5x2+16x-80=0 的根

    用弦截法求方程 f(x)=x3-5x2+16x-80=0 的根. 1.方法分析 (1) 取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根.如果f(x1)与f ...

最新文章

  1. Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP
  2. ubuntu上面安装nodejs,npm,bower,grunt,yeoman
  3. 嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
  4. Python安装与环境变量的配置
  5. JavaScript获取验证码,60秒倒计时方法
  6. 雷观(二):当今时代最须要6项能力
  7. 禁止拖放对象文本被选择的方法
  8. Caffe + Ubuntu 14.04 64bit + CUDA6.5 + 无GPU 配置
  9. A Frustratingly Easy Approach for Joint Entity and Relation Extraction(陈丹琦2020)
  10. Ubuntu 64 测试ODB
  11. JUCE学习笔记01-子组件与Graphics类
  12. linux redis玂家链接不上,Unicode编码的熟悉与研究过程(内附全部汉字编码列表)...
  13. 软件测试基础知识(大全)
  14. 2020年Java面试题及答案_Java面试宝典_Java笔试题(持续更新中)
  15. 速卖通商品详情API接口(商品详情页面数据接口)
  16. Spring的AOP(一):什么是AOP
  17. 系统开机进入boot menu app menu解决办法
  18. 来电显示软件测试自学,用MSComm控件实现来电显示
  19. 1093 打印小写字母表+1101时间的差+1115数字和+1134 国王的魔镜+1387简单加密+1480找字典码最小的字符串+1098判断是否构成回文+1591求子串的位置+1116调换位置
  20. Multisim的使用及面包板

热门文章

  1. 程序员!无论你有没有社保,都不要轻易买保险!
  2. 企业评估私有云和公有云时,需要注意的核心原则
  3. 关于HOSTS设置不生效的解决小方法
  4. nsis 检测vcredist_x86是否安装
  5. python根号运算符_Python-python中 ** 运算符为什么比sqrt()函数效率高很多?
  6. 阿里云服务器怎么购买图文教程
  7. 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面...
  8. Smartbi携手中新赛克达成战略合作,生态构建再上新高度
  9. Go 带缓冲的Reader读文件、一次性读取文件
  10. 男人们实用的:电脑族的护肤秘籍