杂题训练之三

https://www.luogu.org/problem/P1858

模板题,套路东西,思路代码里,很清晰,很明了

code :

#include<bits/stdc++.h>
#define IL inline
#define RI register int
using namespace std;
IL void in(int &x)
{
    int f=1;x=0;char s=getchar();
    while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s>='0' and s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}
int k,v,n,ans,cnt,now[55];
int V[288],W[288],f[5008][55];
int main()
{
    in(k),in(v),in(n);
    for(RI i=0;i<=5000;i++)
        for(RI j=0;j<=50;j++)f[i][j]=-20021003;//赋初值为-inf
    f[0][1]=0;//体积为0的最优解为0.
    for(RI i=1;i<=n;i++)
        in(V[i]),in(W[i]);//V[i]为体积,W[i]为价值.
    for(RI i=1;i<=n;i++)
        for(RI j=v;j>=V[i];j--)
        {
            int c1=1,c2=1,cnt=0;
            while(cnt<=k)
            {
                if(f[j][c1]>f[j-V[i]][c2]+W[i])
                now[++cnt]=f[j][c1++];
                else now[++cnt]=f[j-V[i]][c2++]+W[i];
            }
            //这里选择了开数组记录当前最优解的值,在下面直接赋值给f[j]即可。
            for(RI c=1;c<=k;c++)f[j][c]=now[c];
        }
    for(RI i=1;i<=k;i++)ans+=f[v][i];
    printf("%d",ans);
}
原文地址:https://www.cnblogs.com/wzxbeliever/p/11639431.html