完全背包问题

//朴素写法:
#include <bits/stdc++.h>
using namespace std;
int dp[1001][1001],v[1001],w[1001];

int main()
{
    int N,V;
    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++){
        if(j<v[i])
        dp[i][j]=dp[i-1][j];
        else
        dp[i][j]=max(dp[i][j],dp[i][j-v[i]]+w[i]);//右边的dp[i][j]包含了i-1条件下取所有件物品的最大值,而dp[i][j-v[i]]+w[i]代表了在i条件下,所有的最大值,而在取最大即为状态转移方程
    }
    cout<<dp[N][V];
    return 0;
}

//优化空间写法:

#include <bits/stdc++.h>
using namespace std;
int dp[1001],v[1001],w[1001];
int main()
{
    int N,V;
    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=v[i];j<=V;j++){
        dp[j]=max(dp[j],dp[j-v[i]]+w[i]);//j是从小到大循环,所以dp[j-v[i]]<dp[j],所以dp[j-v[i]]是第二层的,所以可以直接去掉,就不用逆序输入j了
    }
    cout<<dp[V];
    return 0;
}
全部评论

相关推荐

赛博小保安:你这简历没啥大问题的,经历技能也足够了,问题应该就是出在出身了,学院本就是这样,HR忙着跟92的勾搭呢,哪有心思看我们这些双非😿😭
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-04 05:12
瑞雪兆丰年_:可以贴个超级大的校徽,以防HR眼拙
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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