01背包问题

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);
        }
    }
}

 

posted @ 2014-08-02 22:13  米其林轮船  阅读(161)  评论(0编辑  收藏  举报