题解 | #[NOIP2001]装箱问题#

[NOIP2001]装箱问题

https://www.nowcoder.com/practice/55100a6608ad4656849dbd1f16d044cb

import java.util.Scanner; 

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int target=in.nextInt();
        int n=in.nextInt();
        int[] volumes=new int[n];
        for(int i=0;i<n;i++){
            volumes[i]=in.nextInt();
        }
        boolean[]  dp=new boolean[target+1];  //dp[j]中j代表物品加起来的的体积,dp代表是否达到这个体积
        dp[0]=true;
        for(int volume:volumes){
            for(int j=target;j>=volume;j--){
                dp[j]=dp[j]||dp[j-volume];
            }
        }
        for(int j=target;j>=0;j--){
            if(dp[j]){
                int lefted_volume=target-j;
                System.out.println(lefted_volume);
                return;
            }
        }

    }
}

①定义逻辑数组:boolean[] dp=new boolean[target+1]; //dp[j]中j代表物品加起来的的体积,dp代表是否达到这个体积

②创建初始dp值: dp[0]=true

③对每一个物品体积进行遍历,跟新dp数组。并且用上逻辑运算符号或|| : for(int j=target;j>=volume;j--) dp[j]=dp[j]||dp[j-volume];

④找到离target值最近的j,就是自己想要的数字

全部评论

相关推荐

03-24 17:45
门头沟学院 C++
一个头三个大:我也是这样,状态持续了十天然后今天上午流程结束了,应该是横向对比挂了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务