背包问题

题目描述

简单的背包问题。设有一个背包,可以放入的重量为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 背包问题的更多相关文章

  1. 九度oj 题目1028:继续畅通工程

    题目描述:     省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用 ...

  2. poj 1028

    http://poj.org/problem?id=1028 题意(水):做一个游览器的历史记录. back:后退到上一个页面,当上一个页面没有时,输出ignored. forward:向前一个页面, ...

  3. BZOJ 1028: [JSOI2007]麻将 暴力

    1028: [JSOI2007]麻将 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/prob ...

  4. 【动态规划】XMU 1028 Game Boy Advance

    题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1028 题目大意: 求01背包最优解的方案.物件数和物件编号. 题目思路: [动态规划] ...

  5. BZOJ 1028 麻将 枚举

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1028 题目大意: 麻将是中国传统的娱乐工具之一.麻将牌的牌可以分为字牌(共有东.南.西 ...

  6. poj 1028 Web Navigation(模拟)

    题目链接:http://poj.org/problem? id=1028 Description Standard web browsers contain features to move back ...

  7. 【BZOJ】1028: [JSOI2007]麻将(贪心+暴力)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1028 表示不会贪心QAQ 按顺序枚举,如果能形成刻子那么就形成刻子,否则形成顺子.orz 证明?:因 ...

  8. 1028 Web Navigation

    题目链接: http://poj.org/problem?id=1028 题意: 模拟浏览器的前进/后退/访问/退出 的四个操作. 输出当前访问的URL或者Ignore(如果不能前进/后退). 分析: ...

  9. poj 1028 Web Navigation

    Web Navigation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31088   Accepted: 13933 ...

随机推荐

  1. python进阶之time模块详解

    Time模块 Time模块包含的函数 Time模块包含了一下内置的函数,既有时间处理的,也有转换时间格式的: 序号 函数及描述 1 time.altzone 返回格林威治西部的夏令时地区的偏移秒数.如 ...

  2. VMware Workstation中安装linux系统(CentOS)超详细(部分转载)

    首先准备一下VMware虚拟机和linux镜像文件,链接如下: 对于32位windows机子安装的是10.0.7版本的VMware Workstation,链接: https://pan.baidu. ...

  3. C# 读写本地配置文件

    1.在本地有一个如下配置文件 2.读写本地配置文件 3.对配置文件的内容进行操作

  4. Filebeat命令参考

     Filebeat命令参考: Filebeat提供了一个命令行界面,用于启动Filebeat并执行常见任务,例如测试配置文件和加载仪表板.命令行还支持用于控制全局行为的全局标志. 命令: export ...

  5. 如何在已有的 Web 应用中使用 ReactJS

    原文:How to Sprinkle ReactJS into an Existing Web Application 译者:nzbin 当我们学习一项新技术,可能是一个 JavaScript 框架, ...

  6. C++ 标准库之 iomanip 、操作符 ios::fixed 以及 setprecision 使用的惨痛教训经验总结

    本菜鸡自从退役之后就再也没怎么敲过 C++ 代码,在 C++ 语言下,求解关于浮点数类型的问题时,之前有碰到类似的情况,但是似乎都没有卡这块的数据,基本上用一个 setprecision 函数保留几位 ...

  7. BZOJ3328 PYXFIB 单位根反演

    题意:求 \[ \sum_{i=0}^n[k|i]\binom{n}{i}Fib(i) \] 斐波那契数列有简单的矩阵上的通项公式\(Fib(n)=A^n_{1,1}\).代入得 \[ =\sum_{ ...

  8. mybatis 使用接口绑定

    使用selectList,selectOne..的缺陷 刚开始学习mybatis的时候,使用selectList或者selectOne,传入要调用的mapper,如果又参数要传递的话,就需要将参数进行 ...

  9. 初次使用Mybatis

    目录 mybatis简介 导入jar包 创建数据库以及数据库表 创建实体类 创建mapper.xml文件 配置mybatis 测试mybatis 三种查询方式 selectOne selectList ...

  10. android_模拟器调试

    找到adb_server adb_server connect