码迷,mamicode.com
首页 > 其他好文 > 详细

部分和问题

时间:2017-01-17 00:40:34      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:str   pre   for   sum   turn   bool   fst   成功   name   

问题描述 n个数 取其中部分之和能否构成k

dfs + 简单剪枝

 1 #include <iostream>
 2 #include <fstream>
 3 
 4 using namespace std;
 5 
 6 typedef long long ll;
 7 
 8 //每一个数要么选要么不选 所以复杂度是O(2^n)
 9 //还能剪枝  因为当sum超过k时 状态无论如何转移都无法成功
10 ll a[128];
11 ll k;
12 int n;
13 bool dfs(int t, ll s)
14 {
15     if (s == k)
16     {
17         return true;
18     }
19     //剪枝
20     if (s > k) return false;
21     if (t == n) return false;
22     return ( dfs(t+1, s+a[t]) || dfs(t+1, s) );
23 }
24 int main()
25 {
26     ifstream cin ("in.txt");
27     cin >> n;
28     for (int i = 0; i < n; i++)
29     {
30         cin >> a[i];
31     }
32     cin >> k;
33     if ( dfs(0, 0) )cout << "yes" << endl;
34     else cout << "no" << endl;
35 }

 

部分和问题

标签:str   pre   for   sum   turn   bool   fst   成功   name   

原文地址:http://www.cnblogs.com/oscar-cnblogs/p/6291426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!