UVA12455 Bars 题解

此题洛谷题面没有翻译(以后可能会有,以博主发布时间为准),我就简述一下大意吧:

有 \(T\) 组数据,对于每组数据,给定 \(p\) 个数,问 \(p\) 个数中选出一些数,使得和为 \(n\)。

入门题嘛,显然是一个 \(dp\) 题,有点像 \(01\) 背包的模板题。

设 \(l_i\) 为 \(n\) 个数中的第 \(i\) 个,\(j\) 从 \(n\) 依次递减枚举到 \(l_i\),\(f_j\) 为前 \(i\) 个数是否能凑出 \(j\)(为了方便,我就直接使用滚动数组了,如果不懂的话,请 \(bdfs\)),由此得出,当 \(f_{j - l_i}\) 为 \(1\)(前 \(i - 1\) 个数能凑出 \(j - l_i\))时,\(f_j = 1\)(前 \(i\) 个数能凑出 \(j\))。

最后,\(f_n\) 即为答案,上代码!

#include<bits/stdc++.h>
using namespace std;
int T, n, p, l[25], f[1005]; 
int main() {
	scanf("%d", &T);
	for(int t = 1; t <= T; t++) {
		memset(f, 0, sizeof(f));
		scanf("%d%d", &n, &p);
		for(int i = 1; i <= p; i++) scanf("%d", &l[i]);
		f[0] = 1;
		for(int i = 1; i <= p; i++)
			for(int j = n; j >= l[i]; j--)
				if(f[j - l[i]]) f[j] = 1;
		if(f[n]) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
上一篇:Codeforces268D. Wall Bars 五维dp


下一篇:Idea 右侧导航栏消失