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

输入:

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. bzoj4498: 魔法的碰撞

    首先,如果排列确定,那么就可以组合学解决了,不过排列数很多,显然不能枚举. 我们发现如果区间不能重叠的话,总长度减去所有区间长度就是能用的多余格子数. 然而相邻区间可以重叠较小区间一半的长度,因此这些 ...

  2. c# 备份数据库恢复数据库

    /// <summary> /// 对数据库的备份和恢复操作,Sql语句实现 /// </summary> /// <param name="cmdText&q ...

  3. BZOJ 3781: 小B的询问

    3781: 小B的询问 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 643  Solved: 435[Submit][Status][Discuss ...

  4. mysql日期格式化

    DATE_FORMA T(date, format) 根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值 ...

  5. HttpClient 4.3 使用

    httpclient的api变化很快,本篇随笔记录自己使用4.3.6版本时所做的设置.版本虽然不是最新,但达到了目的就行. maven依赖: <dependency> <groupI ...

  6. mogodb3.2源码安装

    mogodb3.2源码安装 下载链接: http://www.mongodb.org/downloads 1.环境准备: 1.mkdir -p /data/tgz #创建存放软件的目录 2.mkdir ...

  7. Alpha阶段第四次Scrum Meeting

    情况简述 Alpha阶段第四次Scrum Meeting 敏捷开发起始时间 2016/10/25 00:00 敏捷开发终止时间 2016/10/26 00:00 会议基本内容摘要 做出了将网络通讯接口 ...

  8. CodeForces 165C Another Problem on Strings(组合)

    A string is binary, if it consists only of characters "0" and "1". String v is a ...

  9. Jedis测试redis

    首先:Jedis是redis的java版本的客户端. public class JedisTest { //单机版测试Jedis,不使用连接池 @Test public void testJedis( ...

  10. Node.js入门笔记(2):全局对象(1)

    以下将以API文档为基础进行分析学习 global对象 这些对象在所有模块里都可用.有些对象不是在全局作用域而是在模块作用域里,这些情况下面文档都会标注出来. __filename--返回当前模块文件 ...