浅谈(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
",f[m]);
return 0;
}