• 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);
            }
        }
    }
  • 相关阅读:
    0814防盗链访问控制代理
    0811Nginx访问日志设置
    0810Nginx安装
    0809LNMP架构介绍
    PHP安装
    mariaDB安装Apache安装(httpd)
    LAMP构架介绍
    shell基础知识(2)
    shell基础知识(1)
    yum更换国内源、yum下载rpm包、源码包安装
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3887546.html
Copyright © 2020-2023  润新知