多重部分和问题
2015-07-24 20:37
267 查看
F 多重部分和问题
Time Limit: 30000/10000MS (Java/Others)问题描述
有n种不同大小的数字,每种各个。判断是否可以从这些数字之中选出若干使它们的和恰好为K。输入
首先是一个正整数T(1<=T<=100)接下来是T组数据
每组数据第一行是一个正整数n(1<=n<=100),表示有n种不同大小的数字
第二行是n个不同大小的正整数 (1<=<=100000)
第三行是n个正整数 (1<=<=100000),表示每种数字有n个
第四行是一个正整数K(1<=K<=100000)
输出
对于每组数据,如果能从这些数字中选出若干使它们的和恰好为K,则输出“Yes”,否则输出“No”,每个输出单独占一行样例输入
23
3 5 8
3 2 2
17
2
1 2
1 1
4
样例输出
YesNo
#include <iostream> #include <cstring> #define Max 110 using namespace std; int ma[Max][2]; int t[Max][100010]; bool test(int m,int n){ if(m==0){ for(int i=0;i<=ma[0][1];++i){ if(n==i*ma[0][0]) { return true; } } return false; } for(int i=0;i<=ma[m][1];++i){ long long temp=n-i*ma[m][0]; if(temp<0) break; if(t[m-1][temp]==1){ return true; }else if(t[m-1][temp]==2){ continue; }else if(test(m-1,temp)) { t[m-1][temp]=1; return true; } t[m-1][temp]=2; } return false; } int main(){ // freopen("1.txt","r",stdin); int T; cin>>T; while(T--){ memset(t,0,sizeof(t));//保证每个样例都有个初始化的数组 ,太重要了,弄了一下午就是这里没有对于每个样例都重新初始化 memset(ma,0,sizeof(ma)); int n; cin>>n; int i; for(i=0;i<n;++i){ cin>>ma[i][0]; } for(i=0;i<n;++i){ cin>>ma[i][1]; } int K; cin>>K; bool b=test(n-1,K); if(b) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
相关文章推荐
- 从AdventureWorks学习数据库建模——实体分析
- 二叉树的遍历
- web中验证码实现
- 约瑟夫问题
- oracle之连接查询及子查询举例
- Openssl s_server命令
- [cocos2dx]抽象元素——CCCamera摄像机类
- 今天遇到的3到智力面试题(给工人分金条,小鸟来回在2火车之间飞行的距离,精确称水问题)
- Two Sum
- [leedcode 125] Valid Palindrome
- C++每次读取一行字符串输入(学习笔记) (转)
- java常量使用
- UVALive 5088 Alice and Bob's Trip(树形DP)
- Linux Fedora 22 配置IP地址文件
- oc014---oc的数据类型
- hdu5246 贪心
- 一切成功源于积累——20150723 货币对之澳美 典型跌势 5分钟定理 八连斩 再次中计
- Top 10 Algorithms of 20th and 21st Century
- 【剑指offer】数值的整数次方
- 路径里的正斜杠和反斜杠