完全背包问题(本题)要点:
保证用较小容量的最大价值去更新较大容量的最大价值,不重不漏。
完全背包核心思路:
//V 最大容量
//w[i] 第i件物品的重量
//v[i] 第i件物品的价值
for(int i=1;;i++){
for(int j=w[i];j<=V;j++){
dp[j]=max(dp[j-w[i]]+v[i],dp[j]);
}
}
完整代码:
时间复杂度: O(N∗V)O(N*V)O(N∗V)
空间复杂度: O(V)O(V)O(V)
#include<bits/stdc++.h>
using namespace std;
int v[1001];
int p[1001];
int dp[10010];
int main()
{
int V,n;
cin>>n>>V;
memset(dp,0,sizeof(dp));//数组默认的其实也是0
for(int i=1;i<=n;i++){
cin>>v[i]>>p[i];
}
for(int i=1;i<=n;i++){
for(int j=v[i];j<=V;j++){
dp[j]=max(dp[j],dp[j-v[i]]+p[i]);
}
}
cout<<dp[V]<<'\n';
return 0;
}