题解 | #毕业bg#动态规划加滚动数组

毕业bg

https://www.nowcoder.com/practice/a3a99a0658a44cb1a37ddf5c164e21a6

#include <iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;

struct node{
    int h,l,t;
};//分别保存快乐度,持续时间,离校时间

bool cmp(node n1,node n2){
    return n1.t<n2.t;
}

int main() {
    int n;
    int h,l,t;
    int maxt;//保存最大的离校时间
    while (scanf("%d",&n)!=EOF&&n>0) {
        maxt=0;
        vector<node>bg(n);
        for(int i=0;i<n;i++){
            scanf("%d%d%d",&h,&l,&t);
            bg[i].h=h;//快乐度
            bg[i].l=l;//持续时间
            bg[i].t=t;//离校时间
            if(t>maxt)//找到最大的离校时间
            	maxt=t;
        } 

        vector<int>dp(maxt+1,0);//将最大离校时间作为背包大小,加1是习惯
        sort(bg.begin(),bg.end(),cmp);
        int maxhappy=0;//保存最大的快乐值
        for(int i=0;i<bg.size();i++){
            for(int j=bg[i].t;j>=bg[i].l;j--){
//如果是二维数组的话,i代表第几件物品,dp[i][j]的值应该是在不取当前物品跟取当前物品两种情况中取最大值,
//即dp[i-1][j],dp[i-1][j-bg[i].l]+bg[i].h中取最大值
//因此,在滚动数组中如果从前往后遍历,前面的j在将本次i代表的物品放入背包后,
//后面的j如果将dp[i-1][j-bg[i].l]+bg[i].h设为自身dp值的话,就会导致本次遍历放入bg[i]这一物品多次
//因此使用一维滚动数组的话应该从后往前遍历
                dp[j]=max(dp[j],dp[j-bg[i].l]+bg[i].h);
                if(dp[j]>maxhappy)
                    maxhappy=dp[j];
            }
        }
        printf("%d\n",maxhappy);
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务