#include <stdio.h> #include <math.h> int* compute(int arr2[], int m, int i, int sum1, int sum2){ int arr[2], sub = 0;; //存放两个参数 找到本轮最优解时候的sum 和 j for(int n = 0; n < i; n++) sum2 -= arr2[n]; //本轮初始值 for(int j = m - 1; j >= i; j--){ if(abs(sum2 - arr2[j] - sum1) < abs(sum2 - sum1)) //比较差值 sum2 -= arr2[j]; else{ arr[0] = sum2; //当轮最优解元素和 arr[1] = j; //当轮最优解尾元素下标 break; } } return arr; } /*思路:从完整数组开始,不断去掉前面的一个元素,用剩下的子数组进行下轮比较; *每轮判断规则(如果满足减去数组2当前的最后一个元素后,如果和数组1差值变小了, *就继续减去尾元素,直到满足差值最小,得到本轮最优解; 用该值和下一轮进行比较, *如果下一轮差值更小,则继续切割数组,找更下一轮,直到不满足,然后根据i,j位置输出数组元素; */ int main(){ int n, m, res, arr1[10], arr2[10], sum1 = 0, sum2 = 0; scanf("%d %d", &n, &m); for(int i = 0; i < n; i++){ scanf("%d", &arr1[i]); sum1 += arr1[i]; } for(int j = 0; j < m; j++){ scanf("%d", &arr2[j]); sum2 += arr2[j]; } int min = *(compute(arr2, m, 0, sum1, sum2)); for(int i = 1; i < m; i++){ res = *compute(arr2, m, i, sum1, sum2); if(abs(res - sum1) < abs(min - sum1)) //比较差值 min = res; else{ i--; //不满足要回溯 int j = *(compute(arr2, m, i, sum1, sum2) + 1); for(int s = i; s <= j; s++) printf("%d ", arr2[s]); break; } } return 0; }