0-1背包|题解-简单的烦恼

题目:

定时t时间关闭播放音乐,最多能听多长时间的歌?

思路:

找边界,据题意,播放音乐时长超过n越长越好,那么最大边界就是n+max[v[i]]-1。背包问题中的体积和价值在这里都是v[i]。

再按照01背包模板写就可以了。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
//        第i首歌进来,使得前i-1首歌<=n-1,而第i首歌进来>=n,即dp[i]-v[i]<n
//         总的-不选的>=n, n-不选的<=max(v[i])-1
//         所以实际边界是,n+max[v[i]]-1
        int T=in.nextInt();
        for(int i=0;i<T;i++){
            int n=in.nextInt();
            int t=in.nextInt();
            int [] nums=new int[n+1];
            int max=0;
            for(int j=0;j<n;j++){
                nums[j]=in.nextInt();
                if(nums[j]>max){
                    max=nums[j];
                }
            }
			
            int[] dp=new int[t+max];
            
            for(int a=0;a<=n;++a){
                for(int b=t+max-1;b>=nums[a];b--){
                    dp[b]=Math.max(dp[b],dp[b-nums[a]]+nums[a]);
                }
            }
            System.out.println(dp[t+max-1]);
        }
         
    }
}

全部评论

相关推荐

2025-12-28 16:32
重庆邮电大学 Java
程序员花海:1.技能放最后,来面试默认你都会,技能没啥用 2.实习写的看起来没啥含金量,多读读部门文档,包装下 接LLM这个没含金量 也不要用重构这种 不会给实习生做的 3.抽奖这个还是Demo项目,实际在公司里面要考虑策略,满减,触发点,触发规则 库存 之类的,不是这个项目这么简单 4.教育背景提前,格式为 教育背景 实习 项目 技能 自我评价
简历被挂麻了,求建议
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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