背包问题之6

来源:互联网 发布:三星ssd数据迁移 编辑:程序博客网 时间:2024/05/13 05:23

背包问题之5中的算法只给出了最大利润的值,而没有给出最大利润下,背包所装物品的方案。下面除了通过回溯算法改进上一个算法的效率,还实现了给出背包所装物品方案的功能。
算法思想:
为找到最大的获利情况,先用最简单的蛮力算法回溯法来解决这个问题。不同于递归算法,递归算法是找大规模问题与小规模问题的关系,回溯法是对问题解空间进行搜索的算法。
C++代码:

#include <iostream>#include <vector>using namespace std;vector<int> v, p;//背包的总重量mint m;//n为物品的总件数int n;//n件物品的取舍情况vector<int> x, x_temp;//最大利润int best = 0;//当前背包的重量int total = 0;//此函数返回背包容量为m,k为当前处理的物品编号,v[i]表示第i+1件物品的重量,p[i]表示第i+1件物品的利润void fun(int k){    //如果遍历完n件物品    if (k == n)    {        int best_t = 0;        for (int j=0;j<n;++j)        {            best_t += x_temp[j] * p[j];        }        if (best_t > best)        {            x = x_temp;            best = best_t;        }        return;    }    //不放第k件物品    x_temp[k] = 0;    fun(k+1);    //放第k件物品    if (total + v[k] <= m)    {        x_temp[k] = 1;        total += v[k];        fun(k+1);        total -= v[k];    }}int main(){    cout<<"请输入背包的总重量:";    cin>>m;    cout<<"请分别输入所有物品的重量与利润:"<<endl;    int wt, pt;    while( cin>>wt>>pt )    {               v.push_back(wt);        p.push_back(pt);        x.push_back(0);        x_temp.push_back(0);        ++n;    }    fun(0);    cout<<"最大利润为:"<<best<<endl;    for (int i=0;i<n;++i)    {        if (x[i] == 1)        {            cout<<"放第"<<i+1<<"件物品."<<endl;        }    }    return 0;}// 5 // 2 5// 3 4// 4 7

运行结果:
这里写图片描述

0 0