AcWing算法提高课 1.3.3 背包问题求方案

背包问题求方案时,可以进行dp过后,根据结果进行反推。

要求输出方案时,不能简化dp数组的维数。

当需要以字典序最小输出结果时,可以考虑从后向考虑物品,从后向前构建dp数组。

这样,反推的时候就可以从第一个物品开始考虑,就可以贪心的解决字典序问题。

(也可以使用标记数组解)

例题 AcWing12. 背包问题求具体方案

代码如下

复制代码
#include<bits/stdc++.h>
using namespace std;

int vs[1010];
int nums[1010];
int dp[1010][1010];
int main()
{
    int N,V;
    cin>>N>>V;
    for(int i=1;i<=N;i++)
    {
        cin>>vs[i]>>nums[i];
    }
    for(int i=N;i>=1;i--)
    {
        int v=vs[i],num=nums[i];

        for(int j=0;j<=V;j++)
        {
            dp[i][j]=dp[i+1][j];
            if(j>=v)
                dp[i][j]=max(dp[i][j],dp[i+1][j-v]+num);
        }
        
    }

    int cur_v=V;
    for(int i=1;i<=N;i++)
    {
        if(cur_v>=vs[i]&&dp[i][cur_v]==dp[i+1][cur_v-vs[i]]+nums[i])
        {
            cout<<i<<' ';
            cur_v-=vs[i];
        }
        else
        {
            ;
        }
    }
    cout<<endl;
}
View Code
复制代码

 

posted @   80k  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示