找规律:[a1、a2、a3...an]
设前n项的和为f(n):f(1)、f(2)、f(3)...f(n)。
则有f(1)=a1;
f(2)=a1+a2+(a1+a2)
可以理解为:fn的值等于没有an的子集和(也就是f(n-1))的值加有an的子集和的值。可以把f(n)拆解为:
f(n)=f(n-1)+Sn(sn表示带an的子集和)
我们来看一下Sn如何求:
Sn=(a1+an)+(a2+an)+...(a1+a2+...+an-1+an)
所以,Sn的值等于(a1,a2...an-1)的和加上前n-1项子集数*an.
即Sn=f(n-1)+2^(n-1)*an。
2^(n-1)表示n-1个元素集合的子集数,这个应该是常识。。。
合并整理得:
f(n)=2*f(n-1)+2^(n-1)*an
代码如下:
#include<bits/stdc++.h>
#define maxn 50
using namespace std;
int a[maxn];
int main(){
long long fn=0;
int n,i=1;
while(cin>>a[i])
{
fn=2*fn+pow(2,i-1)*a[i];
i++;
}
cout<<fn<<endl;
return 0;
}