题意:
给你若干硬币,让你分成两份,使其绝对值之差尽量的小。
思路:
算出硬币的总和,然后把背包容量设置为硬币总和的一半,这个背包能拿到的最大价值即是2个人中某个人要拿到的价值。
01背包的思路就可以解决了。
#include <cstdio> #include <cstdlib> #include <cstring> #define max(a,b) (((a) > (b)) ? (a) : (b)) const int MAXN = 50010; int dp[MAXN]; int a[110]; int main() { int cases; scanf("%d", &cases); while (cases--) { int m; int sum = 0; scanf("%d", &m); for (int i = 0; i < m; ++i) { scanf("%d", &a[i]); sum += a[i]; } memset(dp, 0, sizeof(dp)); int mid = sum >> 1; for (int i = 0; i < m; ++i) for (int v = mid; v >= a[i]; --v) dp[v] = max(dp[v], dp[v-a[i]] + a[i]); int ans; if (dp[mid] * 2 > sum) ans = dp[mid] * 2 - sum; else ans = sum - dp[mid] * 2; printf("%d\n", ans); } return 0; }