首页 > 代码库 > 01背包问题

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