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 ...
随机推荐
- Go语言学习笔记-函数部分(三)
函数部分 函数基本组成:关键字func.函数名.参数列表.返回值.函数体.返回语句 例子: func Add(int a, int b) (return int, err error){ ....函数 ...
- docker容器日志收集方案(方案四,目前使用的方案)
先看数据流图,然后一一给大家解释 这个方案是将日志直接从应用代码中将日志输出到redis中(注意,是应用直接连接redis进行日志输出),redis充当一个缓存中间件有一定的缓存能力,不过有限,因 ...
- Dynamics 365 CRM 开发架构简介
Dynamics 365 CRM提供了多种编程模型,你可以灵活地按需选用最佳模式. 本文是对Dynamics 365 CRM编程模型的综述. 概览 下图表明了Dynamics 365 CRM的主要可编 ...
- Spark中的一些概念
最近工作用到Spark,这里记一些自己接触到的Spark基本概念和知识. 本文链接:https://www.cnblogs.com/hhelibeb/p/10288915.html 名词 RDD:在高 ...
- Django contenttypes 组件
contenttypes组件 介绍 Django包含一个contenttypes应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Conte ...
- linux目录1
1.linux常用快捷键 2.linux命令之vmstat 3.linux命令之df 4.linux命令之netstat 5.linux命令之 tar 6.The authenticity of ho ...
- Hexo + GitEE 搭建、备份、恢复、多终端
Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页. Hexo 是使用的比较多的博客框架了,我也尝试自己搭 ...
- 09-JavaScript之伪数组arguments
JavaScript之伪数组arguments arguments代表的是实参.有个讲究的地方是:arguments只在函数中使用. 1.返回函数实参的个数 使用argument.length方法返回 ...
- openstack搭建之-cinder配置(12)
一. base节点配置 mysql -u root -proot CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder ...
- SpringBoot配置devtools实现热部署
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...