题解 | 【模板】完全背包

【模板】完全背包

https://www.nowcoder.com/practice/237ae40ea1e84d8980c1d5666d1c53bc

#include <bits/stdc++.h>

using namespace std;

const int MN=1010;

int N, V;
int v[MN], w[MN], f1[MN], f2[MN];   //f1/2[V]表示容量不超过/恰好等于V的最大价值

int main()
{
    cin>>N>>V;
    memset(f2, -1, sizeof f2);
    f2[0]=0;
    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<=V; j++)
            {
                f1[j]=max(f1[j], f1[j-v[i]]+w[i]);
                if(f2[j-v[i]]!=-1) f2[j]=max(f2[j], f2[j-v[i]]+w[i]);
            }
    f2[V]=max(0, f2[V]);

    cout<<f1[V]<<"\n"<<f2[V];
    return 0;
}
/*
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-1,j], f[i][j-v]+w[i])
*/

/*int main()
{
    cin>>N>>V;
    
    for(int i=1;i<=N;i++) cin>>v[i]>>w[i];
    
    for(int i=1;i<=N;i++)
        for(int j=0;j<=V;j++)
            for(int k=0; k*v[i]<=j; k++)
                f[i][j]=max(f[i][j], f[i-1][j-k*v[i]]+k*w[i]);
                
    cout<<f[N][V];
    return 0;
    
}*/

第一问就是完全背包的裸题,推导可以看注释代码

第二问可以初始时只让f2[0]合法,转移时避免了从非法状态转移过了

即可愉快ac!

#牛客春招刷题训练营#

全部评论

相关推荐

12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务