首页 > 其他 > 详细

01背包问题

时间:2014-08-02 23:18:14      阅读:445      评论:0      收藏:0      [点我收藏+]

01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值,Wi表示第i件物品的重量。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
 
#include<iostream>
#include<vector>
using namespace std;

vector<int>v;
int w[5]={3,3,3,3,3};
int p[5]={5,5,5,5,5};
void result(int**c,int i,int j);

int main()
{
    int **c=new int*[6];
    for(int i=0;i<6;i++)
    {
        *(c+i)=new int[11];
    }

    for(int i=0;i<6;i++)
    {
        for(int j=0;j<11;j++)
        {
            if(i == 0 || j == 0)
            {
                c[i][j]=0;
            }
            else
            {
                if(w[i-1]>j)
                {
                    c[i][j]=c[i-1][j];
                }
                else
                {
                    c[i][j]=max(c[i-1][j-w[i-1]]+p[i-1],c[i-1][j]);
                }
            }
        }
    }
    cout<<c[5][10]<<endl;
    result(c,5,10);

    for(int i=0;i<6;i++)
    {
        delete[]*(c+i);
        *(c+i)=NULL;
    }
    delete[]c;
    c=NULL;
    return 0;
}

void result(int**c,int i,int j)
{
    if(i==0 || j==0)
    {
        for(int i=0;i<v.size();i++)
        {
            cout<<v[i]<<" ";
        }
        cout<<endl;
        return;
    }
    if(w[i-1]>j)
    {
        result(c,i-1,j);
    }
    else
    {
        if(c[i-1][j-w[i-1]]+p[i-1] > c[i-1][j])
        {
            v.push_back(i);
            result(c,i-1,j-w[i-1]);
        }
        else if(c[i-1][j-w[i-1]]+p[i-1] == c[i-1][j])
        {
            vector<int>temp(v);
            v.push_back(i);
            result(c,i-1,j-w[i-1]);
            

            v.swap(temp);
            result(c,i-1,j);
        }
        else
        {
            result(c,i-1,j);
        }
    }
}

 

01背包问题,布布扣,bubuko.com

01背包问题

原文:http://www.cnblogs.com/johnsblog/p/3887546.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!