数据结构 - 用递归算法解决实际问题
2016-06-01 18:09
337 查看
实验题目:
编写一个程序exp5-2.cpp,求解背包问题:设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的总价值最大。源码:
#include<iostream> #define Max 100 using namespace std; struct bag { int weight; int value; }; int n; int limweight; int maxv; int allvalue; int setting[Max]; int cop[Max]; bag a[Max]; void find(int,int,int); int main() { int k,w,v; cout<<"物品种数:"; cin>>n; for(allvalue=0,k=0; k<n; k++) { cout<<"第"<<k+1<<"种物品(重量,价值):"; cin>>w>>v; a[k].weight=w; a[k].value=v; allvalue+=v; } cout<<"背包所能承受的总重量:"; cin>>limweight; maxv=0; for(k=0; k<n; k++) cop[k]=0; find(0,0,allvalue); cout<<"最佳装填方案是:"<<endl; for(k=0; k<n; k++) if(setting[k]) cout<<" 第"<<k+1<<"种物品"<<endl; cout<<"总价值="<<maxv<<endl;; } void find(int i,int w,int v) { int k; if(w+a[i].weight<=limweight) { cop[i]=1; if(i<n-1) find(i+1,w+a[i].weight,v); else { for(k=0; k<n; k++) setting[k]=cop[k]; maxv=v; } cop[i]=0; } if(v-a[i].value>maxv) if(i<n-1) find(i+1,w,v-a[i].value); else { for(k=0; k<n; k++) setting[k]=cop[k]; maxv=v-a[i].value; } }
基本思路:
第i件物品的选择有两种可能:物品i被选择,这种可能性仅当包含它不会超过方案总重量的限制时才是可行的。选中后,继续递归去考虑其余物品的选择。
物品i不被选择,这种肯能性仅当不包含物品i也有可能会找到价值更大的方案的情况。
是否已拿完物品也就是i < n(i是当前物品序号,n是物品总数目)是否成立,如果成立则递归结束并打印输出路径。如果i < n则判断第i个物品能否放入背包,如果不能放入,则考虑放置i+1个物品,如果能放入还存在当前第i个放入和不放入两种情形后对第i+1个的影响。
运行结果:
相关文章推荐
- 从源码安装Mysql/Percona 5.5
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 浅析Ruby的源代码布局及其编程风格
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- asp.net 抓取网页源码三种实现方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- JS小游戏之仙剑翻牌源码详解
- JS小游戏之宇宙战机源码详解
- jQuery源码分析之jQuery中的循环技巧详解
- 本人自用的global.js库源码分享
- java中原码、反码与补码的问题分析
- Java数据结构及算法实例:冒泡排序 Bubble Sort