LFYZ-OJ ID: 1028 背包问题
背包问题
题目描述
简单的背包问题。设有一个背包,可以放入的重量为s。现有n件物品,重量分别为w1,w2…,wn,(1≤i≤n)均为正整数,从n件物品中挑选若干件,使得放入背包的重量之和正好为s。找到一组解即可。
输入
第一行是物品总件数和背包的载重量,第二行为各物品的重量。
输出
各所选物品重量。
样例输入
5 10
1 2 3 4 5
样例输出
number:1 weight:1
number:4 weight:4
number:5 weight:5
分析
背包问题是最经典的算法问题之一。当数据量很小时,使用枚举法把所有情况测试一遍即可解决,然而当数据量很大时,这种方法就无可行性,需要使用到二叉树结构和动态规划等进行解决,这在以后的学习中会讲到。在这里因为数据量很小,我们仍然考虑最简单的方法:枚举。
这样枚举:有n件商品,每件商品可以选择装或者不装,那就有2X2X2X...X2=2n种情况。你知道为什么n很大的时候就不能枚举了吧?指数级的时间复杂度时很可怕的!
该如何编程实现上面的枚举方法?这其实也是n个物品的组合问题。这里提供一个递归的思路。函数
bool search(int itemNum, int space)
有两个参数,第一个参数是物品编号,第二个参数是背包的空间大小。- 递归的终止条件1:space<0----->return false;(超重)
- 递归的终止条件2:space==0---->return true;(刚好装满)
- 递归的终止条件3:itemNum==0-->return false;(没有物品了)
- 递归方法
- search(itemNum-1, space-item[itemNum])装上物品itemNum,尝试装物品itemNum-1
- search(itemNum-1, space)不装物品itemNum,尝试装物品itemNum-1
递归过程中itemNum从n递归到1,这是因为输出格式中物品号码小的在前、大的在后,按照递归的顺序,后入栈的先出栈,也就是后装的先输出,所以枚举过程中先枚举编号大的物品,最后枚举编号小的物品,使得输出时先输出编号小的物品。需要注意的是,满足情况的装载情况不只有一种,例程在找到一种方案后即返回,不会把所有的方案找出来。你可以自己尝试一下,把所有的装载情况列举出来!
例程
#include<iostream>
using namespace std;
int n, item[1000]; //item数组存储物品的重量
int s;
bool search(int itemNum, int space){
if(space==0) return true; //终止条件
if(space<0 || itemNum==0) return false; //终止条件
if(search(itemNum-1, space-item[itemNum])){ //装物品itemNum,尝试装物品itemNum-1,成功返回true
cout<<"number:"<<itemNum<<" weight:"<<item[itemNum]<<endl;
return true;
}
if(search(itemNum-1, space)){ //不装物品itemNum,尝试装物品itemNum-1,成功返回true
return true;
}
return false;
}
int main(){
cin>>n>>s;
for(int i=1; i<=n; i++) cin>>item[i];
if(!search(n, s)) //返回false代表没有找到合适的方案
cout<<"not found";
return 0;
}
LFYZ-OJ ID: 1028 背包问题的更多相关文章
- 九度oj 题目1028:继续畅通工程
题目描述: 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用 ...
- poj 1028
http://poj.org/problem?id=1028 题意(水):做一个游览器的历史记录. back:后退到上一个页面,当上一个页面没有时,输出ignored. forward:向前一个页面, ...
- BZOJ 1028: [JSOI2007]麻将 暴力
1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/prob ...
- 【动态规划】XMU 1028 Game Boy Advance
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1028 题目大意: 求01背包最优解的方案.物件数和物件编号. 题目思路: [动态规划] ...
- BZOJ 1028 麻将 枚举
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1028 题目大意: 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西 ...
- poj 1028 Web Navigation(模拟)
题目链接:http://poj.org/problem? id=1028 Description Standard web browsers contain features to move back ...
- 【BZOJ】1028: [JSOI2007]麻将(贪心+暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1028 表示不会贪心QAQ 按顺序枚举,如果能形成刻子那么就形成刻子,否则形成顺子.orz 证明?:因 ...
- 1028 Web Navigation
题目链接: http://poj.org/problem?id=1028 题意: 模拟浏览器的前进/后退/访问/退出 的四个操作. 输出当前访问的URL或者Ignore(如果不能前进/后退). 分析: ...
- poj 1028 Web Navigation
Web Navigation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 31088 Accepted: 13933 ...
随机推荐
- idea软件破解汉化
→http://idea.lanyus.com/上可以找到最新的破解补丁,下载并放到软件的bin目录下 →更改bin目录下的两个文件:Idea.exe.vmoptions和Idea64.exe.vm ...
- idea右键无法新建Java Class
项目中新建目录之后,要在该目录下新增java Class文件,右键——>New发现无对应选项. 原因:新建目录之后需要设置目录作用,从而让idea识别. 方法:File-Project Stru ...
- app原生和H5混合使用自动化
1.从原生切换到H5需要 driver.switch_to.context('WEBVIEW_com.tencent.mm:tools') 2.参考连接: https://testerhome.com ...
- Mac下MySql初始密码设置及mysql数据库操作
1. 首先 点击系统偏好设置 -> 点击MySQL, 在弹出的页面中,关闭服务.2. 进入终端命令输出: cd /usr/local/mysql/bin/ 命令,回车.3. 回车后,输入命令:s ...
- 混合编程[python+cpp+cuda]
很多时候,我们是基于python进行模型的设计和运行,可是基于python本身的速度问题,使得原生态python代码无法满足生产需求,不过我们可以借助其他编程语言来缓解python开发的性能瓶颈.这里 ...
- PS制作漂亮紫色霓虹灯光文字
一.新建画布,大小1500 * 950像素,分辨率为300,置入墙壁图像,大小适合. 二.调整图层的色阶,色相/饱和度. 三.新建文字图层,颜色为#a33e88,大小为103,字体为Beon Medi ...
- 相片后期处理,PS调出温暖的逆光美女
原图: 效果图: 后面就是开PS导图: 说明下,因为拍的时候大概知道自己的方法会让照片变暖,现场光线又很暖,所以色温要调低一些,这边是4100,其他不用变,直接转JPG调色了 1:第一步是加第一个曲线 ...
- excel冻结标题栏,让标题栏不滚动的方法
https://jingyan.baidu.com/article/148a1921f54afe4d71c3b18e.html
- 23个Python爬虫开源项目代码,让你一次学个够
今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [1]– 微信公众号 ...
- 前端获取checkbox复选框的值 通过数组形式传递
html代码: <form role="form" class="select_people"> <div style="displ ...