数据结构 - 用递归算法解决实际问题

原创 2016年06月01日 18:09:15

实验题目:

编写一个程序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个的影响。

运行结果:

结果1

结果2

版权声明:本文为博主原创文章,未经博主允许不得转载,复制。

浅谈以数据结构的视角去解决算法问题的步骤

浅谈以数据结构的视角去解决算法问题的步骤 在程序设计中,很多复杂的算法设计问题,从数据结构的角度来看其实都可以按照这种思路来解决: 1.对于要处理的一组数据,根据实际需求整理出要处理的数据元素...
  • zolalad
  • zolalad
  • 2014年05月14日 14:49
  • 1472

(一)实际项目中树形数据结构与递归算法应用

在每个项目中都涉及到菜单的展示,在这里普遍用到了树形数据结构和递归算法: 举例如下: 建表: 1.模拟效果图: 2.代码片段: 3.数据库中运用sql进行树形查询: mysql比较麻烦...

算法研究--使用 红黑树 解决实际问题(理论与实践)

在查找中,虽然hash表查找非常迅速,但是随着数据的种类增多, hash表长会变得更长,且冲突也会越来越多,那么如何能实现无论在 多大数据量的情况下,查找依然是高性能的呢?    在1978...

java数据结构递归算法

  • 2009年06月02日 16:27
  • 3KB
  • 下载

【C/C++】C语言复习笔记-17种小算法-解决实际问题

判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构 - 用递归算法解决实际问题
举报原因:
原因补充:

(最多只允许输入30个字)