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 }
正解:
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 }