0-1背包问题
来源:互联网 发布:python运维 编辑:程序博客网 时间:2024/05/16 11:09
- 题目描述
- 输入
- 输出
- 样例输入
- 样例输出
题目描述
有 n 件物品, 每件物品有一个价值和一个重量,分别记为: b1,b2, …bn w1,w2, …wn 其中所有的 重量wi 均为整数。 现有一个背包,其最大载重量为W,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大?
输入
第1行:2个整数n(1<=n<=1000)和W(1<=W<=10000),分别表示物品的件数和背包的最大载重量。 第2-n+1行:每行2个用空格分开的整数,第i+1行的整数表示第i件物品的重量wi和价值bi(1<=bi,wi<=10000)。
输出
第1行:1个整数,表示背包所能装下的物品的最大总价值。 第2-?行:每行3个用空格分开的整数,i, wi, bi,分别表示最优解中的物品的编号、重量和价值。
样例输入
4 52 33 44 55 6
样例输出
71 2 32 3 4
0-1背包问题是动态规划算法里非常重要的一种问题,其他背包问题如完全背包、多维背包等都是基于它而发展出来的。这道题属于要输出路径的那类背包问题。因为数据比较大,用数组存储路径会超时。因此,我们用递推的方式输出路径。
#include<climits>#include<iostream>using namespace std;int w[1005],p[1005],v[1005][10005];//w表示物品的重量,p表示物品的价值,v表示总价值void print(int x,int y)//递归地输出路径{ if(x==0||y==0)//判断边界 return; if(v[x][y]==v[x-1][y])//如果当时没有用这个数的话就不输出,接着递归 { print(x-1,y); } else { print(x-1,y-w[x]); cout<<x<<' '<<w[x]<<' '<<p[x]<<endl;//递归输出 } return;}int main(){ int n,k;//n表示物品的件数,k表示背包的容量 cin>>n>>k; for(int i=1;i<=n;i++) cin>>w[i]>>p[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=k;j++) { if(j>=w[i]) { v[i][j]=max(v[i-1][j],v[i-1][j-w[i]]+p[i]); } else { v[i][j]=v[i-1][j]; } }//状态转移方程:v[i][j]=max(v[i-1][j],v[i-1][j-w[i]]+p[i])(j>=w[i]) v[i][j]=v[i-1][j](j<w[i]) cout<<v[n][k]<<endl; print(n,k); return 0;}
阅读全文
0 0
- 背包问题(0-1背包、完全背包、多重背包)详解
- 背包问题和0-1背包问题
- 背包问题和0-1背包问题
- 背包问题系列--"0-1背包问题"
- 背包笔记-含0/1背包问题、完全背包问题、多重背包问题、二维背包问题、分组背包问题
- 【背包问题】背包问题之0-1背包、完全背包、多重背包
- 0-1背包问题
- 0/1背包问题
- 0,1背包问题
- 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- // 0-1背包问题
- 0/1背包问题
- 0-1背包问题
- 0-1背包问题
- 0-1背包问题
- 0/1背包问题
- mysql 数据库函数
- 低于1.0版本 pod使用
- 3DES加解密-ZipCompressor
- 图片轮播
- N
- 0-1背包问题
- Androidstudio 导入mode 报错:"Manifest merger failed with multiple errors, see logs"
- mybatis查询时间段sql语句
- 个人笔记 github
- java 根据日期计算星期几
- Xml之Pull解析
- 使用Snapdragon Profiler工具分析Dragonboard410c(二)
- Java Swing中菜单栏、弹出式菜单、树形控件的使用
- 理解RESTful架构-转载自阮一峰的网络日志