要比赛了 ,才临时抱佛脚。算法的确虐人,确实,现在觉得数学真他喵可爱啊!!!!!! 但没事,厚着脸皮继续敲! 1.【问题描述】 某市市长获得了若干批口罩,每一批口罩的数目如下: 9090400 8499400 5926800 8547000 4958200 4422600 5751200 4175600 6309600 5865200 6604400 4635000 10663400 8087200 4554000 现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只 能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。 请你计算这个差最小是多少?
2.思路 (1)首先要使两家医院的口罩差值最小,是背包问题的一种变形 如果两家医院平均分是sum/2 但也存在一家医院分多 设为LargeNum ,另一家医院分的少SmallNum 所以差值为=(LageNum-sum/2)*2=(sum/2-SmallNum)*2
每家医院可看作一个容量为sum/2的背包,只有SmallNum尽可能大才能保证差值最小
(2)要用到的API接口 max() 方法用于返回两个参数中的最大值。
public class Test{
public static void main(String args[]){
System.out.println(Math.max(12.123, 18.456));
System.out.println(Math.max(23.12, 23.0));
}
}
输出 18.456 23.12
3.代码实现 方法1:
package 蓝桥杯;
public class 分配口罩 {
public static int[] num= {9090400, 8499400, 5926800, 8547000, 4958200,
4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000,
10663400, 8087200, 4554000};
public static long res=Long.MAX_VALUE;
public static void main(String[] args) {
dfs(0,0,0);
System.out.println(res);
}
public static void dfs(int k,int sum1,int sum2)
{
if(k==15)
{
res=res<Math.abs(sum1-sum2)?res:Math.abs(sum1-sum2);
return;
}
dfs(k+1,sum1+num[k],sum2);
dfs(k+1,sum1,sum2+num[k]);
}
}
4.答案 2400
|