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

输入:

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. bzoj 2738 矩阵乘法

    其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...

  2. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  3. js 用途

    嵌入动态文本于HTML页面.[4]  对浏览器事件做出响应.[4]  读写HTML元素.[4]  在数据被提交到服务器之前验证数据.[4]  检测访客的浏览器信息.[4]  控制cookies,包括创 ...

  4. python 网络编程

    一.网络知识的一些介绍 socket是网络连接端点.例如当你的Web浏览器请求www.pythontik.com上的主页时,你的Web浏览器创建一个socket并命令它去连接www.pythontik ...

  5. JavaScript写在Html页面的<head></head>中

    JavaScript写在Html页面的<head></head>中 ----------------- <html> <head> <style ...

  6. ArcGIS Server开发教程系列(3)切片

    切片工作,我们可以一级一级的切,也可以,所有的一块切,Recreate All Tiles这项是说,在没有进行任何的切片工作时,可以选用这项:Recreate Empty Tiles这项是说,如果之前 ...

  7. python requests模块使用

    python的网络编程能力十分强大,其中python中的requests库宣言:HTTP for Humans (给人用的 HTTP 库) 在网络编程中,最基本的任务包含: 发送请求 登录 获取数据 ...

  8. 将C#文档注释生成.chm帮助文档

    由于最近需要把以前的一个项目写一个文档,但一时又不知道写成怎样的,又恰好发现了可以生成chm的工具,于是乎我就研究了下,感觉还不错,所以也给大家分享下.好了,不多废话,下面就来实现一下吧. 生成前的准 ...

  9. java 环境变量java_home配置多加了 \ 导致zookeeper莫名其妙问题。

    平时开发其实不太用得到java_home.path.classpath之类的环境变量,但是在命令行下运行java则需要用上,所以配错就可能出现莫名其妙错误. 错误JAVA_HOME 配置:D:\Pro ...

  10. C和指针 第九章 习题

    9.15 编写函数格式化金钱为标准字符串 #include <stdio.h> #include <string.h> #define TEMP_LEN 1000 void d ...