美文网首页动态规划专题
背包问题求具体方案

背包问题求具体方案

作者: Tsukinousag | 来源:发表于2021-03-18 19:53 被阅读0次

    原题链接

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N=1010;
    
    int v[N],w[N];
    int n,m;
    int dp[N][N];
    
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>v[i]>>w[i];
        //从后往前从n号背包转移到1号背包,得到当前最大的背包的体积dp[1][m]
        for(int i=n;i>=1;i--)
        {
            for(int j=0;j<=m;j++)
            {
                //默认不选
                dp[i][j]=dp[i+1][j];
                //当体积大于v[i]时,要选
                if(j>=v[i])
                    dp[i][j]=max(dp[i+1][j],dp[i+1][j-v[i]]+w[i]);
            }
        }
        //再从dp[1][v]往前往后找,是由哪个背包转移过来的
        int vol=m;
        for(int i=1;i<=n;i++)
        {
            if(dp[i][vol]==dp[i+1][vol-v[i]]+w[i] && v[i]<=vol)
            {
                cout<<i<<" ";
                vol-=v[i];
            }
        }
        
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:背包问题求具体方案

        本文链接:https://www.haomeiwen.com/subject/ydmpcltx.html