背包问题求具体方案数(字典序最小的具体方案(路径))

背包问题求具体方案数(字典序最小的具体方案(路径))

在这里插入图片描述
输入样例:

4 5
1 2
2 4
3 4
4 6

输出样例:

1 4

代码模板:

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
int v[N], w[N];
int f[N][N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    //总结:字典序 dp 可倒序操作
    for (int i = n; i >= 1; i -- )
        for (int j = 0; j <= m; j ++ )
        {
            f[i][j] = f[i + 1][j];
            if (j >= v[i]) f[i][j] = max(f[i][j], f[i + 1][j - v[i]] + w[i]);
        }

    int j = m;
    //字典序最小方案 路径
    for (int i = 1; i <= n; i ++ )
        if (j >= v[i] && f[i][j] == f[i + 1][j - v[i]] + w[i])
        {
            cout << i << ' ';
            j -= v[i];
        }
    return 0;
}

 

posted @ 2022-03-22 14:17  panse·  阅读(72)  评论(0)    收藏  举报