递归算法解决01背包问题并输出最佳方案

问题及代码:

/*
* Copyright (c) 2016, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:01.cpp
* 作    者:单昕昕
* 完成日期:2016年5月16日
* 版 本 号:v1.0
* 问题描述:编写一个程序exp5-2.cpp,求解背包问题:
            设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,
            使选中物品的总重量不超过指定的限制重量,但选中物品的总价值最大。
* 程序输入:n种物品的价值和重量。
* 程序输出:选取物品的最佳方案和物品的最大总价值。
*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define MAXN 1001
int w[MAXN],v[MAXN],vis[MAXN][MAXN];
//分别表示物品重量、价值和是否取得该方案的标记
int n;//物品总数
int rec(int i,int j,int sum)
{
    int res;
    if(i==n)  res=sum;//递归出口
    else if(j<w[i])
    {
        res=rec(i+1,j,sum);
        vis[i-1][j]=0;
    }
    else
    {
        if(rec(i+1,j,sum)<rec(i+1,j-w[i],sum+v[i])) vis[i+1][j-w[i]]=1;//标记方案被取得
        res=max(rec(i+1,j,sum),rec(i+1,j-w[i],sum+v[i]));
    }
    return res;
}

int main()
{
    memset(w,0,sizeof(w));//初始化
    memset(v,0,sizeof(v));
    memset(vis,0,sizeof(vis));
    cout<<"物品种数:";
    cin>>n;
    int i,cnt=0;
    char c;//逗号的输入
    for(i=0; i<n; ++i)
    {
        cout<<"第"<<++cnt<<"种物品(重量,价值):";
        cin>>w[i]>>c>>v[i];
    }
    cout<<"背包所能承受的总重量:";
    int vol;
    cin>>vol;
    cout<<"最佳装填方案是:"<<endl;
    int ans=rec(0,vol,0);//调用递归函数求得总价值
    for(i=0; i<n; ++i)//输出装填方案
        for(int j=0; j<vol; ++j)
            if(vis[i][j]==1)
            {
                cout<<"第"<<i<<"种方案"<<endl;
                break;
            }
    cout<<"总价值:"<<ans<<endl;
    return 0;
}


运行结果:

 

多了一个vis标记方便输出方案。

你可能感兴趣的:(C++,01背包)