关于背包问题的题目,前人之述备矣,这里只讨论实现

输入:

n

ca

w_1 v_1

w_2 v_2

...

w_n v_n

其中,n是物品总数,ca是背包大小,w_n是第n个物品的重量,v_n是第n个物品的价值

输出:

v_1 x

v_2 x

v_3 x

...

其中,v_n是当前情况为x时背包的价值,x是一串序列,由0,1组成,表示是否放入背包

如: 1001就表示第一个和最后一个物品放入背包,中间两个物品不放入

要求编写一个程序,输出所有可满足解.

思路很简单,就是穷举.穷举每一个情况.

伪代码如下:

f() {
if (没有可以放进背包的东西) {
输出
} else {
放进背包
f()
不放进背包
f()
恢复原状
}
}

这样,就构造了一个二叉树,可以输出每一种可选解的情况.

我的代码如下:

 #include <iostream>
#include <functional> struct Pack {
unsigned cnt;
unsigned *w; // weights
unsigned *v; // values
unsigned *x; // put in or not
unsigned ca; // capacity Pack(unsigned items_cnt) : cnt(items_cnt) {
w = new unsigned [items_cnt];
v = new unsigned [items_cnt];
x = new unsigned [items_cnt]; for (int i = ; i < items_cnt; ++i) {
w[i] = v[i] = x[i] = -;
}
} ~Pack() {
delete [] w;
delete [] v;
delete [] x;
}
}; int main() {
unsigned c; std::cin >> c; Pack p(c); std::cin >> p.ca; for (int i = ; i < p.cnt; ++i) {
std::cin >> p.w[i] >> p.v[i];
} std::function<unsigned()> totval = [&]() {
unsigned cnt = ; for (int i = ; i < p.ca; ++i) {
if (p.x[i] == ) cnt += p.v[i];
} return cnt;
}; std::function<unsigned()> totwt = [&]() {
unsigned cnt = ; for (int i = ; i < p.ca; ++i) {
if (p.x[i] == ) cnt += p.w[i];
} return cnt;
}; std::function<void()> loop = [&]() {
unsigned no = -;
for (int i = ; i < p.cnt; ++i) {
if (p.x[i] == -) {
no = i;
break;
}
} if (no == -) {
std::cout << totval() << ' ';
for (int i = ; i < p.cnt; ++i) {
std::cout << p.x[i];
}
std::cout << std::endl;
} else {
p.x[no] = ;
loop(); p.x[no] = ; if (totwt() <= p.ca) {
loop();
} p.x[no] = -;
}
}; loop(); return ;
}

测试数据:


输出:


可以找到最优解,10101.

[C++11][算法][穷举]输出背包问题的所有可满足解的更多相关文章

  1. 基本算法思想之穷举法(C++语言描述)

    穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场 ...

  2. 穷举算法和递推算法(Java)

    穷举算法 概念: 最简单算法,依赖计算机的强大计算能力穷尽每一种可能的情况.穷举算法效率不高,但是适合一些没有明显规律可循的场合. 思想: 在使用穷举算法时,需要明确问题答案的范围,这样才可能在指定范 ...

  3. [牛客网 -leetcode在线编程 -01] max-points-on-a-line -穷举

    题目及题目来源 链接:https://www.nowcoder.com/questionTerminal/bfc691e0100441cdb8ec153f32540be2 来源:牛客网 首页 > ...

  4. 比赛安排(穷举法或dfs)

    比赛安排 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 10[提交][状态][讨论版][命题人:外部导入] 题目描述 设有2n(n<=6)个球队进行单循环比赛,计划在 ...

  5. 对动态规划(Dynamic Programming)的理解:从穷举开始(转)

    转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...

  6. 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753

    下面给出两道POJ上的问题,看如何用穷举法解决. [例9]Calling Extraterrestrial Intelligence Again(POJ 1411) Description A mes ...

  7. 通过穷举法快速破解excel或word加密文档最高15位密码

    1.打开文件 2.工具 --- 宏 ---- 录制新宏 --- 输入名字如 :aa 3.停止录制 ( 这样得到一个空宏 ) 4.工具 --- 宏 ---- 宏 , 选 aa, 点编辑按钮 5.删除窗口 ...

  8. while do while以及穷举和迭代

    今天的新内容1:while循环 格式: while() { } 初始状态要在循环外提前规定 状态改变要写在花括号里面 括号内是循环条件 for循环与while循环的对比: 2:do while 不管循 ...

  9. 5月4日课堂内容:for循环的穷举、迭代

    一.for循环拥有两类: 1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.迭代: 从初始情况按照规律不断求解中间情况,最终推导出结果. 二.穷举练习 1.单位给发了一张 ...

随机推荐

  1. VBScript使用CDO.Message发送邮件

    Const Email_From = "from@163.com" Const Password = "password" Const Email_To = & ...

  2. poi导出的excel的数字小数位过多?

    最近在使用Apache的POI组件对Excel进行操作,在对excel导出的时候,导出的数字本来只有两位小数,得到的结果就变成了很多位小数.如下面的图所示: 虽然对单元格使用了setCellStyle ...

  3. <<< html图片背景平铺

    CSS背景图片平铺技巧 使用CSS来设置背景图片同传统的做法一样简单,但相对于传统控制方式,CSS提供了更多的可控选项,我们先来看看最基本的设置图片的方法.html代码: 代码如下: <divi ...

  4. 如何学习Oracle

    如何学习Oracle?分清几个概念是关键     经常有一些Oracle的初学者问到以下几个问题,这里集中解答一下,希望对大家有帮助.   1.如果有一定的数据库基础,知道SQL是怎么回事,即使写不出 ...

  5. Google Maps API V3 之绘图库 信息窗口

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  6. [小程序]那些icons

    摘要 为了提供更友好的提示信息,会使用icon+信息的方式,向用户提示当前操作的成功,失败或者一些警告信息.小程序也为我们定义了一些icons,足够大部分情况的使用了. 那些icons 我们新建一个名 ...

  7. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

  8. (转载)PHPCMS V9专题路径多了一个斜杠的解决办法

    PHPCMSV9的专题,在设置生成静态并且网站的静态设置成生成在根目录的时候,专题路径的URL中会多出一个斜杠,如:http://www.2cto.com//special/ddos/ ,我只能说这是 ...

  9. 非常简单的升级phpnow自带的php版本到5.3的方法

    下载PHP5.3 下载地址百度一下“PHP5.3下载”就有很多网站提供下载的,也可以去官网下载最新的,记得下载ZIP压缩的噢 2 解压与命名 将下载的PHP5.3压缩包解压至phpnow的安装目录,命 ...

  10. EF Code First 常用命令

    1.Enable-Migrations  开启版本库 2. Add-Migration addname 新增版本 3.Update-Database –TargetMigration: addname ...