UVA - 562 Dividing coins

题目大意:给出 n 个硬币的面值, 要求将这 n 个硬币分成两堆(不要求个数平均), 尽量使得两堆硬币的和之差的绝对值最小, 并输出最小值的绝对值


解题思路:将 sum 总和看成是背包的容量, 然后进行01背包处理, 然后取尽量接近half的可达到值cur, sum - 2 * cur 就是所要求的值 ans


#include <cstdio>

int main() {
	int T, n;
	scanf("%d", &T);
	while (T--) {
		int temp, sum = 0, DP[50005] = {0};
		DP[0] = 1;
		scanf("%d", &n);
		while (n--) {
			scanf("%d", &temp);
			sum += temp;
			for (int i = sum; i >= 0; i--)
				if (DP[i])
					DP[i + temp] = 1;
		}
		for (temp = sum / 2; !DP[temp]; temp--);
		printf("%d\n", sum - 2 * temp);
	}
	return 0;
}


你可能感兴趣的:(UVA - 562 Dividing coins)