题目:
思路:
简单思考后可以想到一个回溯的做法
考虑每个物品是给第一个人还是第二个人还是丢掉
答案的最差解是所有物品都丢弃
看到代码后会觉得竟如此简单
时间复杂度O(T × 3^n)
代码:
public class Main {
/**
* one 给第一个人
* two 给第二个人
* res 结果,一开始为全部的和,因为最差的解就是所有都丢弃
* left 剩下的物品价值
*/
static int one, two, res, left;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
int m = sc.nextInt();
int[] data = new int[m];
one = 0;
two = 0;
res = 0;
left = 0;
for (int j = 0; j < m; j++) {
data[j] = sc.nextInt();
res += data[j];
}
process(data, 0);
System.out.println(res);
}
}
public static void process(int[] data, int currentIndex){
int len = data.length;
if (currentIndex == len){
if (one == two){
res = Math.min(res, left);
}
return;
}
one += data[currentIndex];
process(data, currentIndex+1);
one -= data[currentIndex];
two += data[currentIndex];
process(data, currentIndex+1);
two -= data[currentIndex];
left += data[currentIndex];
process(data, currentIndex+1);
left -= data[currentIndex];
}
}
leetcode上有几乎原题,不过是求反向答案
题目链接
其中的一个题解
用的动态规划可以同样求本笔试题,时间复杂度O(n^2)