AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

背包记录路径

作者: 作者的头像   彦辰kkkkk ,  2023-03-19 23:01:58 ,  所有人可见 ,  阅读 31


2


1

背包记录路径

主要就是i - - 时有没有else的区别
01背包没有else
完全背包有else

    int i = n, j = m;
    while(i > 0 && j > 0)
    {
        if(path[i][j] == 1)
        {
            cout << w[i] << endl;
            j -= v[i];
        }
        else i -- ;
    }

01背包

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;

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

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];

    for(int i = 1; i <= n; i ++ )
        for(int j = m; j >= v[i]; j -- )
        {
            if(f[j] < f[j - v[i]] + w[i])
            {
                f[j] = max(f[j], f[j - v[i]] + w[i]);
                path[i] = 1;
            }
        }   
    cout << f[m] << endl;

    int i = n, j = m;
    while(i > 0 && j > 0)
    {
        if(path[i][j])
        {
            cout << w[i] << endl;
            j -= v[i];
        }
        i -- ;
    }

    return 0;
}

完全背包

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;

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

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];

    for(int i = 1; i <= n; i ++ )
        for(int j = v[i]; j <= m; j ++ )
            if(f[j] < f[j - v[i]] + w[i])
            {
                f[j] = max(f[j], f[j - v[i]] + w[i]);
                path[i][j] = 1;
            }

    cout << f[m] << endl;

    int i = n, j = m;
    while(i > 0 && j > 0)
    {
        if(path[i][j] == 1)
        {
            cout << w[i] << endl;
            j -= v[i];
        }
        else i -- ;
    }

    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息