CSL分苹果
https://ac.nowcoder.com/acm/contest/24213/1020
题目描述
CSL手上有n个苹果,第i个苹果的质量是wi,现在他想把这些苹果分给他的好朋友wavator和tokitsukaze。但是CSL为了不让他们打架,根据质量决定尽量地均分成两堆分给他们。现在CSL想知道到底给每个人分多少质量的苹果。
注意:苹果不能劈开来,并且如果不能正好均分,tokitsukaze小姐姐会拿到重的那一堆。
输入描述
第一行输入一个整数n(2 ≤ n ≤ 100),第二行n个整数,表示每个苹果的质量wi(1 ≤ wi ≤ 100)。
输出描述
输出两个整数,分别表示wavator和tokitsukaze得到的苹果的质量。
样例
#1
3
2 2 2
2 4
提示
解析
给你 n 个苹果,将其分成两堆。01背包问题,苹果的质量即为价值,要将苹果按质量均分为两堆,那么必然是 质量/2,我们可以先计算其中一堆的苹果个数,将总质量除以2,就是一堆的质量,以此质量为上界进行01背包即可。
计算出其中一堆的苹果个数后,剩下的苹果个数即为另外一名同学苹果个数,且另外一名同学的苹果个数一定大于或等于该同学。
AC Code
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), sum = 0;
int[] W = new int[10005];
int[] dp = new int[10005];
for(int i = 1; i <= n; i++) {
W[i] = sc.nextInt();
sum += W[i];
}
int t = sum >> 1;
for(int i = 1; i <= n; i++) {
for(int j = t; j >= W[i]; j--) {
dp[j] = Math.max(dp[j], dp[j-W[i]] + W[i]);
}
}
System.out.println(dp[t] + " " + (sum - dp[t]));
}
}