最大值(第十二届 国赛 T4)

发布时间 2023-03-31 21:53:26作者: 王浩泽

 

 这是一道周赛题目,完全背包模板,但是打周赛的时候眼一瞎,手一抖,看成了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;
}