UVA - 624 CD

题目大意:要把 CD 上的音乐导到磁带里,要求尽量使磁带剩余的空间小并按顺序打印出每次磁带中的每个音轨长度。tracks不超过 20,且按顺序输出,当有多种答案时, 输出任意一种


解题思路:01背包, 在处理的同时记录最优解


#include <cstdio>

int main() {
	int T, n;
	while (scanf("%d%d", &T, &n) != EOF) {
		int DP[3000] = {0}, rec[25][3000] = {0}, V[25];
		for (int i = 0; i < n; i++) {
			scanf("%d", &V[i]);
			for (int j = T; j >= V[i]; j--)
				if (DP[j-V[i]] + V[i] > DP[j]) {
					DP[j] = DP[j-V[i]] + V[i];
					rec[i][j] = 1;
				}
		}

		int temp = T;
		for (int i = n-1; i >= 0; i--)
			if (rec[i][temp]) {
				printf("%d ", V[i]);
				temp -= V[i];
			}
		printf("sum:%d\n", DP[T]);
	}
	return 0;
}


你可能感兴趣的:(UVA - 624 CD)