java解法

问题背景
背包问题:你有一个容量有限的背包和一系列的物品(文件)。每个文件有大小,你需要选择放哪些文件,以使得背包中的文件总大小最大。
具体情况:每个文件的大小单位是字节,但必须向上取整为 512 字节的倍数,这意味着文件的大小必须按照 512 字节的单位来存放。
解决方案
背包容量的单位:为了简化问题,背包的容量不再以字节为单位,而是将容量转换为 512 字节的块数。因此,背包容量为 1474560 / 512 = 2880 块。
动态规划:利用动态规划数组 dp[] 来存储在给定背包容量下,最大能够放入的文件字节总数。dp[j] 表示在背包容量为 j 块时,能够获得的最大文件字节总数。
状态转移:对于每个文件,我们尝试将其放入背包,更新 dp[] 数组,最终得到最大能放入的文件字节总和

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 读取文件数量
        int n = sc.nextInt();
        
        // 文件大小数组
        int[] arr = new int[n];
        
        // 读取每个文件的大小
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        // 计算最大可放入背包的文件字节总大小
        System.out.println(getMaxFileSize(n, arr));
    }

    // 动态规划求解最大文件字节总和
    public static int getMaxFileSize(int n, int[] arr) {
        // 背包的容量,单位为512字节块
        int maxCapacity = 1474560 / 512;  // 2880块

        // 动态规划数组,dp[i]表示容量为i块时,能装入的最大字节数
        int[] dp = new int[maxCapacity + 1];  // 数组长度为最大容量+1

        // 遍历每个文件
        for (int i = 0; i < n; i++) {
            // 当前文件占用的背包容量,单位为512字节块
            int weight = (int) Math.ceil(arr[i] / 512.0);  // 向上取整,单位为512字节块
            // 当前文件的字节数
            int worth = arr[i];  // 文件的字节大小

            // 更新动态规划数组,从后往前更新,避免重复使用同一个文件
            for (int j = maxCapacity; j >= weight; j--) {
                dp[j] = Math.max(dp[j], dp[j - weight] + worth);
            }
        }

        // 返回背包容量为maxCapacity时能装入的最大字节数
        return dp[maxCapacity];
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145065574"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!