P2415 集合求和

因为快要NOIP了,今天是11.5,还有五天。。。在qbxt的时候暴力老是拿不到分,所以就专门来练习搜索,从入门难度开始做,这是第二道标签是搜索但其实是数学的题,一共做了两道题,全是假搜索,搜索复杂度2^n,而且不能加剪枝。

谁都能看懂的60分dfs(一共就五个点):

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int cnt,num[50];
 7 long long ans;
 8 
 9 void dfs(int now,long long sum)
10 {
11     if(now>cnt-1)
12     {
13         ans+=sum;
14         return;
15     }
16     dfs(now+1,sum);
17     dfs(now+1,sum+num[now]);
18 }
19 
20 int main()
21 {
22     while(cin>>num[++cnt]);
23     dfs(1,0);
24     printf("%lld",ans);
25     return 0;
26 }
View Code

正解:

 1 /*
 2     一个集合一共有2^n个子集,其中每个子集中,元素a可以选,也可以不选。
 3     所以被选与不选各占二分之一,被选的次数为(1/2)*(2^n)=(2^n)/2=2^(n-1)
 4     所以把所有元素的和加起来,然后乘以他们出现的次数 -> sum * 2^(n-1)
 5 */  
 6 
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 
11 long long ans;
12 
13 int main()
14 {
15     int a,cnt=0;
16     while(~scanf("%d",&a)) ans+=a,++cnt;
17     long long sum=1;
18     sum<<=(cnt-1);
19     printf("%lld",ans*sum);
20     return 0;
21 }
View Code

 

posted @ 2017-11-05 16:35  whymhe  阅读(479)  评论(0编辑  收藏  举报