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

输入:

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. bzoj4726【POI2017】Sabota?

    首先可以推出来如果i没有带头叛变,那么i的父亲也一定不会带头叛变,证明显然 所以最劣情况初始的叛徒肯定是叶子,并且带头叛变的人一定是从某个叶子往上走一条链 f[i]表示i不带头叛变的话最小的x 那么我 ...

  2. 怪物AI之发现玩家(视觉范围发现系列)

    在网上找到一些资料参考,然后写写自己的想法. 这里感谢MOMO等大神. 我们用玩家检测怪物的方法来测,这样比较试用与弱联网游戏,每次在同步玩家的时候来判断玩家与怪物的位置. 这里给出两个处理方式: 1 ...

  3. [bigdata] 使用Flume hdfs sink, hdfs文件未关闭的问题

    现象: 执行mapreduce任务时失败 通过hadoop fsck -openforwrite命令查看发现有文件没有关闭. [root@com ~]# hadoop fsck -openforwri ...

  4. jQuery 复习

    jQuery 复习 基础知识 1, window.onload $(function(){});   $(document).ready(function(){}); 只执行函数体重的最后一个方法,事 ...

  5. Google Maps API V3 之 路线服务

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

  6. 第二轮冲刺-Runner站立会议08

    今天:优化日历界面 明天:将日历界面与主程序结合

  7. 百度编辑器 Ueditor 下拉处增加字体

    左百度,添加到同右钉邮那么多:                                               1.\ueditor\lang\zh-cn\zh-cn.js  文件中找到: ...

  8. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  9. HTML的初体验

    有话先说:记得初次接触HTML代码还是在两年多前的事情,那是只是凭着一时的兴趣.却不知一入HTML深似海,再见依旧还是兴趣或许就是美好生活的必备. 不用说的是HTML是制作网页,网站开发必须要掌握并学 ...

  10. 【C语言入门教程】目录/大纲

    第一章 C语言编程基础 1.1 基本程序结构 1.2 函数库 和 链接 1.3 C语言“32个”关键字 第二章 数据类型.运算符和表达式 2.1 数据类型(5种基本数据类型),聚合类型与修饰符 2.2 ...