Welcome to SunSkydp's cnblogs|

sunskydp

园龄:3年4个月粉丝:2关注:0

UVA12455 Bars 题解

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

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

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

lin 个数中的第 i 个,jn 依次递减枚举到 lifj 为前 i 个数是否能凑出 j(为了方便,我就直接使用滚动数组了,如果不懂的话,请 bdfs),由此得出,当 fjli1(前 i1 个数能凑出 jli)时,fj=1(前 i 个数能凑出 j)。

最后,fn 即为答案,上代码!

#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;
}

本文作者:SunSkydp

本文链接:https://www.cnblogs.com/sunskydp/p/solution-uva12455.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   sunskydp  阅读(19)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起