洛谷【P1616】疯狂的采药

浅谈\(DP\)https://www.cnblogs.com/AKMer/p/10437525.html

题目传送门:https://www.luogu.org/problemnew/show/P1616

\(01\)背包:https://www.cnblogs.com/AKMer/p/10437672.html

完全背包。把\(01\)背包的倒着枚举改成正着枚举即可,这就相当于是用包含使用了\(i\)号物品的状态来继续更新包含\(i\)号物品的状态,表示每个物品可以用无限多个。

时间复杂度:\(O(nm)\)

空间复杂度:\(O(m)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn=1e5+5;

int n,m;
int f[maxn];

int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    return x*f;
}

int main() {
    m=read(),n=read();
    for(int i=1;i<=n;i++) {
        int w=read(),v=read();
        for(int j=w;j<=m;j++)
            f[j]=max(f[j],f[j-w]+v);
    }
    printf("%d\n",f[m]);
    return 0;
}
posted @ 2019-02-26 15:29  AKMer  阅读(131)  评论(0编辑  收藏  举报