求背包问题所有解(C++实现)

这是我学习数据结构时的一道上机作业,那时还没养成写注释的习惯,所以各位得受点苦了。

只是简易背包问题。

代码:

展开
  1 // 背包问题所有解
  2 // 作者:王锦 
  3 // 邮箱:jinksw@vip.qq.com
  4 
  5 #include "stdafx.h"
  6 #include <iostream>
  7 #include <stack>
  8 #include <list>
  9 using namespace std;
 10 
 11 class BagProblemSolver
 12 {
 13 private:
 14     int *stuffWeight;
 15     int s;
 16     int n;
 17     list<list<int>*> allResultHolder;//存放所有解
 18     void insertResultToList(stack<int> bagStack);
 19 public:
 20     BagProblemSolver(int s,int n,int *stuffWeight)
 21     {
 22         this->s = s;
 23         this->n = n;
 24         this->stuffWeight = new int[n];
 25         for(int i = 0;i < n;++i)
 26             this->stuffWeight[i] = stuffWeight[i];
 27     }
 28     ~BagProblemSolver()
 29     {
 30         delete[] stuffWeight;
 31     }
 32     list<list<int>*> getAllResult();
 33 };
 34 
 35 list<list<int>*> BagProblemSolver::getAllResult()
 36 {
 37     if(s <= 0)
 38         return allResultHolder;
 39     int currentWeight = 0;
 40     stack<int> indexStack;
 41     int i = 0;
 42     do
 43     {
 44         while(currentWeight < s && i < n)
 45         {
 46             if(currentWeight + stuffWeight[i] <= s)
 47             {
 48                 indexStack.push(i);
 49                 currentWeight += stuffWeight[i];
 50             }
 51             i++;
 52         }
 53         if(currentWeight == s)
 54         {
 55             insertResultToList(indexStack);
 56             i = indexStack.top();
 57             indexStack.pop();
 58             currentWeight -= stuffWeight[i];
 59             i++;
 60         }
 61         else if(!indexStack.empty())
 62         {
 63             i = indexStack.top();
 64             indexStack.pop();
 65             currentWeight -= stuffWeight[i];
 66             i++;
 67         }
 68     }while(!indexStack.empty() || i < n);
 69     return allResultHolder;
 70 }
 71 
 72 
 73 
 74 void BagProblemSolver::insertResultToList(stack<int> bagStack)
 75 {
 76     stack<int> tempStack;//用于将解以正序存入list
 77     while(!bagStack.empty())
 78     {
 79         tempStack.push(bagStack.top());
 80         bagStack.pop();
 81     }
 82     list<int> * resultList = new list<int>();
 83     while(!tempStack.empty())
 84     {
 85         resultList->push_back(stuffWeight[tempStack.top()]);
 86         tempStack.pop();
 87     }
 88     allResultHolder.push_back(resultList);
 89 }
 90 
 91 int _tmain(int argc, _TCHAR* argv[])
 92 {
 93     cout << "请输入背包可以放入的物品重量.(输入q退出)" << endl;
 94     char c;
 95     cin >> c;
 96     while(c != 'q')
 97     {
 98         cin.putback(c);
 99         int s = 0;
100         cin >> s;//背包可以放入的物品重量
101         cout << "请输入物品数量." << endl;
102         int n = 0;//物品数量
103         cin >> n;
104         int *stuffWeight= new int[n];
105         cout << "请分别输入" << n << "个物品重量." << endl;
106         for(int i = 0;i < n;++i)
107             cin >> stuffWeight[i];
108         BagProblemSolver test(s,n,stuffWeight);
109         list<list<int>*> ls = test.getAllResult();
110         cout << "背包容量(" << s << "),有(" << n << ")个物品,";
111         cout << "质量分别为(";
112         for(int i = 0; i < n;++i)
113         {
114             cout << stuffWeight[i];
115             if(i != n - 1)
116                 cout << ",";
117         }    
118         cout << ")" << endl;
119         if(ls.empty())
120         {
121             cout << "此问题无解!" << endl;
122         }
123         else
124         {
125             cout << "所有解为:" << endl;
126             while(!ls.empty())
127             {
128                 list<int> *temp = ls.front();
129                 ls.pop_front();
130                 while(!temp->empty())
131                 {
132                     cout << temp->front() << " ";
133                     temp->pop_front();
134                 }
135                 cout << endl;
136                 delete temp;
137             }
138         }
139         cout << "请输入背包可以放入的物品重量.(输入q退出)" << endl;
140         cin >> c;
141     }
142 }

 

 

转载于:https://www.cnblogs.com/jinks/archive/2013/04/26/3044930.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA--自制斐波那契数列输出

累了&#xff0c;写点简单的。 1 public class hello {2 3 /**4 * param args5 */6 public static void main(String[] args) {7 int Fabnum 10;8 int sum 0;9 System.out.print("Serial:\t"); 10 for(int i 1…

9、C语言 —— 指针的用处

为什么80%的码农都做不了架构师&#xff1f;>>> 1、用函数实现两个数的交换 ‍‍在没用函数之前&#xff0c;可以这样实现‍‍#include <stdio.h>int main() {int a 3;int b 7;int c;printf("交换前&#xff0c;a%d&#xff0c;b%d\n", a, b); …

java动态代理二cglib

2019独角兽企业重金招聘Python工程师标准>>> java动态代理 转载于:https://my.oschina.net/u/1430510/blog/290215

中断的上下半部

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 因为输入类设备的输入都是异步事件&#xff0c;因此一般使用中断来处理和响应。 中断处理程序处于中断上下文中&#xff0c;不能和用户空间数据交互&#xff08;不能使用copy_to(from)_usr函数…

图片播放器小项目(详解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。一、开始动手写代码 1、Makefile介绍 &#xff08;1&#xff09;这是一个通用的项目管理的Makefile体系&#xff0c;自己写的&#xff08;有子文件夹组织的&#xff09;项目可以…

Telnet远程访问思科交换机、路由器

一、实验目的Telnet远程访问思科交换机、路由器二、实验拓扑三、实验步骤1、PC1远程管理S11&#xff09;配置交换机的管理IPS1(config)#int vlan 1S1(config-if)#ip add 192.168.1.100 255.255.255.0S1(config-if)#no shu2&#xff09;开启S1的telnet远程管理服务S1(config)#li…

[置顶]       cocos2d-x 手游源码站

尊重开发者的劳动成果&#xff0c;转载的时候请务必注明出处&#xff1a;http://blog.csdn.net/haomengzhu/article/details/37829061 1、魔幻方块 链接&#xff1a;魔幻方块源码关键词&#xff1a;魔幻方块源码 源代码 Cocos2d-x2.0 游戏源码 益智 休闲 游戏 游戏类型&#xf…

Android SDK开发包国内下载地址

原帖地址&#xff1a;http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/2769409.html 不知道是因为最近kaihui还是怎么的&#xff0c;打开android sdk官方网站特别的慢&#xff0c;想下载最新版本的platform几乎变成不可能完成的任务&#xff0c;不知道为什么Google不像…

SharePoint 2013 Workflow - Advanced Workflow Debugging with Fiddler

来自&#xff1a;Andrew Connell [MVP SharePoint] | 时间&#xff1a;2012-07-18 19:26:30 原文链接&#xff1a; http://www.andrewconnell.com/blog/archive/2012/07/18/sharepoint-2013-workflow-advanced-workflow-debugging-with-fiddler.aspx In previous posts Iv…

java sheet 打印区域设定,如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)...

如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)问题描述 (Problem Description)如何使用Java设置电子表格的打印区域。解决方案 (Solution)以下是使用Java设置电子表格打印区域的程序。import java.io.File;import java.io.Fi…

RedHat6.2 x86手动配置LNMP环境

为什么80%的码农都做不了架构师&#xff1f;>>> 因为公司要求用RedHat配&#xff0c;顺便让我练习一下Linux里面的操作什么的。 折腾来折腾去终于搞好了&#xff0c;其实也没那么难嘛。但是也要记录一下。 首先&#xff0c;是在服务器里面用VMware搭建的RedHat6.2 …

《c语言深度剖析》读书笔记

一、注意点 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 二、问题 1、 2、 3、 4、 5、 6、 7、

androidpn的一次亲密接触(二)

简单看了一下源码的实现&#xff0c;这里贴一点个人觉得比叫重要的代码。 XmppManager.java 构造方法&#xff1a;Java代码public XmppManager(NotificationService notificationService) 在这里主要是从共享引用中取得xmpp服务器地址和端口号、用户名和密码。 内部类Java代码…

指针知识学习[总]

printf("p %p.\n", p); // %p打印指针和%x打印指针&#xff0c;打印出的值是一样的 printf("p 0x%x.\n", p); 一、指针是什么&#xff1f; 1、指针变量和普通变量的区别 指针的实质就是个变量&#xff0c;它跟普通变量没有任何本质区别。指针完整的名字…

php excel 分页,excel分页线怎么增加

增加excel分页线的方法&#xff1a;首先依次点击“工作簿视图-分页预览”&#xff1b;然后点击要在其下方插入分页符的这一行&#xff1b;最后在“页面布局”选项卡上的“页面设置”组中&#xff0c;单击“分隔符”即可。本文操作环境&#xff1a;Windows7系统&#xff0c;Micr…

C# 中的委托和事件

PDF 浏览&#xff1a;http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdf文中代码在VS2005下通过&#xff0c;由于VS2003(.Net Framework 1.1)不支持隐式的委托变量&#xff0c;所以如果在一个接受委托类型的位置直接赋予方法名&#xff0c;在VS2003下会报…

php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数

上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问PHP没有类似的自动生成项目框架的工具吗&#xff1f; 当然有。这篇文章就开始介绍使用 "php-ext-cli" 工具来生成扩展项目文件注意这里的 "php-ext-cli" 本身没有这玩意&#xf…

(转载)说说char

char一直都在使用并且大量的使用&#xff0c;但是&#xff0c;大部分都是在单一平台上&#xff0c;那样没有太多的问题&#xff0c;在windows上大量直接使用wchar_t来解决中文的问题。并且在使用跨平台时也大多直接使用了Qt的QString来节省了很多的麻烦&#xff0c;但是现在项目…

WPF 正確理解ContentPresenter

2019独角兽企业重金招聘Python工程师标准>>> 我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement); 同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement. 在Control類並…

java动态交叉表,SqlServer如何生成动态交叉表查询

为了说明问题&#xff0c;我们用SqlServer自带的事例数据库(Northwind)来进行验证&#xff0c;所有的例子请放到Northwind中运行&#xff0c;我可能会省略Use语句&#xff0c;所引用的表&#xff0c;都是Northwind中的&#xff0c;下面我就不再说明了这里指的交叉表&#xff0c…