目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。
但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件拷贝出来,而且只有一张软盘可以使用。
因此这一张软盘是唯一可以用来拷贝文件的载体。
科学家想要尽可能多的将计算机中的信息拷贝到软盘中,做到软盘中文件内容大小最大。
已知该软盘容量为1474560字节。文件占用的软盘空间都是按块分配的,每个块大小为512个字节。一个块只能被一个文件使用。拷贝到软盘中的文件必须是完整的,且不能采用任何压缩技术。
二、输入描述
第1行为一个正数N,表示计算机中的文件数量,1 <= N <= 1000
接下来的第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小Si,单位为字节。
0 <=i <= N, 0 <= Si
三、输出描述
科学家最多能拷贝的文件总大小
四、解题思路
- 第1行为一个正数N;
- 接下来的第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小Si,单位为字节;
- 定义一个sum变量,计算软盘可以存放的块数;
- 动态规划数组,dp[i] 表示容量为 i 的背包可以存储的最大文件大小;
- 循环遍历N行数字;
- 把文件大小转换成块数;
- 输出科学家最多能拷贝的文件总大小;
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest {
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();
}
// 计算软盘可以存放的块数
int sum = 1474560 / 512;
// 动态规划数组,dp[i] 表示容量为 i 的背包可以存储的最大文件大小
int[] dp = new int[sum + 1];
for (int i = 0; i < n; i++) {
// 把文件大小转换成块数
int weight = (int) Math.ceil(arr[i] / 512.0);
int worth = arr[i];
for (int j = sum; j >= weight; j--) {
dp[j] = Math.max(dp[j], dp[j - weight] + worth);
}
}
System.out.println(dp[sum]);
}
}
六、效果展示
1、输入
3
737270
737272
737288
2、输出
1474542
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。