最大值(第十二届 国赛 T4)
这是一道周赛题目,完全背包模板,但是打周赛的时候眼一瞎,手一抖,看成了01模板,写出了01模板,嘤嘤嘤,来复习一下完全背包动态转移方程:f[i][j]=max(f[i-1][j],f[i][k-p[i]]+k[i]);
对了再顺便讲一下压缩版
f[i , j ] = max( f[i-1,j] , f[i-1,j-v]+w , f[i-1,j-2*v]+2*w , f[i-1,j-3*v]+3*w , .....)
f[i , j-v]= max( f[i-1,j-v] , f[i-1,j-2*v] + w , f[i-1,j-3*v]+2*w , .....)
由上两式,可得出如下递推关系:
f[i][j]=max(f[i,j-v]+w , f[i-1][j])
那么k循环(原来用来遍历拿几个)即可拆了k循环,接着来,这玩意像不像01模板中的的转移方程?因此,从01汲取精华,再精简一下:f[j] = max(f[j],f[j-v[i]]+w[i]); 完美
照着板子写ING~:
#include<bits/stdc++.h> using namespace std; const int N=1010; int v[N],w[N],n,v1,f[N]; int main() { ios::sync_with_stdio(false); cin>>v1>>n; 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<=v1;j++) { f[j]=max(f[j],f[j-v[i]]+w[i]); } } cout<<f[v1]; return 0; }