0/1背包,完全背包,多重背包 问题 C++实现

参考博客 https://blog.csdn.net/na_beginning/article/details/62884939

 

/***************************************************
*  函数功能:0/1 背包问题 递归和非递归版本
*  参数说明
*       输入参数: weight  = { 3, 2, 4, 7 };
                   costs   =  { 5, 6, 3, 19 };
                   max_bag = 11;
*       输出参数: 25
*  复杂性分析:时间复杂度:O(N*M),空间复杂度:O(N*M)
*  题目来源  :
*  作者:guoliang zheng
*  日期:2018-08-15-10.19
***************************************************/
int Bag_Quistion::get_MAX_value(vector weight,vector costs,int max_bag)
{
    if(weight.size()<1 || costs.size()<1 || max_bag<1) return 0;
    int row=weight.size();
    vector > dp(row+1,vector(max_bag+1,0));
    for(int i=row-1;i>=0;i--)
    {
        for(int j=0;j<=max_bag;j++)
        {
            dp[i][j]=dp[i+1][j];
            if(j-weight[i]>=0)
            {
                dp[i][j]=max(dp[i][j],costs[i]+dp[i+1][j-weight[i]]);
            }
        }
    }
    cout<<"--------------------------------"< res(row,0);
    int r=0;
    int c=max_bag;
    while(r weight,vector costs,int max_bag)
{
    if(weight.size()<1 || costs.size()<1 || max_bag<1) return 0;
    return get_MAX_value_DG(weight,costs,max_bag,0,0);
}

int Bag_Quistion::get_MAX_value_DG(vector weight,vector costs,int max_bag,int i,int allget)
{
    if(i==weight.size())
    {
        return 0;
    }
    if(allget>max_bag)
    {
        return 0;
    }
    int left=get_MAX_value_DG(weight,costs,max_bag,i+1,allget);
    int right=0;
    if(allget+weight[i]<=max_bag)
    {
        right=costs[i]+get_MAX_value_DG(weight,costs,max_bag,i+1,allget+weight[i]);
    }
    return max(left,right);

}

/***************************************************
*  函数功能:完全背包问题
*  参数说明
*       输入参数:
*       输出参数:
*  复杂性分析:时间复杂度:O(N*M),空间复杂度:O(N*M)
*  题目来源  :
*  作者:guoliang zheng
*  日期:2018-08-15-16.24
***************************************************/
int Bag_Quistion::get_MAX_value_Complete(vector weight,vector costs,int max_bag)
{
    if(weight.size()<1 || costs.size()<1 || max_bag<1) return 0;
    int row=weight.size();
    vector > dp(row+1,vector(max_bag+1,0));
    for(int i=row-1;i>=0;i--)
    {
        for(int j=0;j<=max_bag;j++)
        {
            dp[i][j]=dp[i+1][j];
            if(j-weight[i]>=0)
            {
                dp[i][j]=max(dp[i][j],dp[i][j-weight[i]]+costs[i]);
            }
        }
    }

    for(int i=0;i res(row,0);
    int r=0;
    int c=max_bag;
    while(r weight,vector costs,vector number,int max_bag)
{
    if(weight.size()<1 || costs.size()<1 || number.size()<1 || max_bag<1 || weight.size()!=costs.size() || weight.size()!=number.size() || costs.size()!=number.size())
        return 0;
    int row=weight.size();
    vector > dp(row+1,vector(max_bag+1,0));
    for(int i=row-1;i>=0;i--)
    {
        for(int j=0;j<=max_bag;j++)
        {
            dp[i][j]=dp[i+1][j];
            if(j-weight[i]>=0)
            {
                int counts=min(number[i],j/weight[i]);
                for(int k=1;k<=counts;k++)
                {
                    dp[i][j]=max(dp[i][j],dp[i+1][j-weight[i]*k]+k*costs[i]);
                }
            }
        }
    }
    for(int i=0;i res(row,0);
    int r=0;
    int c=max_bag;
    while(r0;k--)
        {
            if(dp[r][c]==(dp[r+1][c-weight[r]*k]+k*costs[r]))
            {
                res[r]=k;
                c=c-weight[r]*k;
                break;
            }
        }
        r++;
    }
    for(int i=0;i

 

你可能感兴趣的:(数据结构与算法)