其实完全背包和01背包是一样的,01背包是只能用一次或者零次,而完全背包则是可以使用无数次。01背包仅限一次是倒序循环,所以完全背包的无限次正向循环不就好了吗。
原题链接:3. 完全背包问题 - AcWing题库
也是非常的简单ac代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int dp[N];
int v[N];
int w[N];
int n,m;
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++){//和01背包唯一的不同点
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout<<dp[m]<<endl;
return 0;
}