专栏文章

题解:P1048 [NOIP2005 普及组] 采药

P1048题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqiejnr
此快照首次捕获于
2025/12/04 05:18
3 个月前
此快照最后确认于
2025/12/04 05:18
3 个月前
查看原文

背包问题

本题在读完题目后,会发现这是一道经典的 0101 背包问题。
我们回顾下如何求解 0101 背包问题:
首先假设每件物品的体积为 viv_{i},价值为 wiw_{i}
定义状态为 fi,jf_{i,j} 表示前 ii 个物品,容量为 jj 的情况下的最优解。
初始化为 f0,0f_{0,0}00
接下来是状态转移:
当前的物品可以选也可以不选。
若不选第 ii 件物品,则状态为 fi1,jf_{i-1,j}
若选第 ii 件物品,则状态为 fi1,jvi+wif_{i-1,j-v_{i}}+w_{i}
我们要求最优解,因此在以上两种情况求最大值即可。
再回看这道题:采摘某株草药的时间其实就是物品的体积,草药的价值其实就是物品的价值。
因此我们使用动态规划 0101 背包算法即可得到正确答案。
以下是代码:
CPP
#include<iostream>
using namespace std;
const int N = 1e3+5;
int T,m,f[N],v[N],w[N];
int main()
{
    cin>>T>>m;
    for(int i = 1;i<=m;i++)
        cin>>v[i]>>w[i];
    for(int i = 1;i<=m;i++)
        for(int j = T;j>=v[i];j--)
            f[j] = max(f[j],f[j-v[i]]+w[i]);
    cout << f[T] << endl;
    return 0;
}

评论

2 条评论,欢迎与作者交流。

正在加载评论...