ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA12455 Bars 题解

2022-01-31 13:33:39  阅读:135  来源: 互联网

标签:Bars bdfs UVA12455 int 题解 凑出 个数 printf


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

有 \(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;
}

标签:Bars,bdfs,UVA12455,int,题解,凑出,个数,printf
来源: https://www.cnblogs.com/sunskydp/p/solution-uva12455.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有