c/ C

来源:互联网 发布:知即墨下载 编辑:程序博客网 时间:2024/06/02 02:14

用递归写的,然后超时了,知道应该去找规律,可是。。。。没找到尴尬

C - Sumsets

1) 1+1+1+1+1+1+1
2) 1+1+1+1+1+2
3) 1+1+1+2+2
4) 1+1+1+4
5) 1+2+2+2
6) 1+2+4

递归的码

#include <iostream>using namespace std;int dou[25];int num;void findd(int n,int i){   int  y=n/dou[i];    if(dou[i]>n)        return ;    for(int j=y;j>=0;j--)    { int  x=dou[i]*j;      if(x+dou[i+1]==n||x==n)       {  num++;       }      else        findd(n-x,i+1);    }    return;}int main(){    int n;    for(int i=1,j=0;i<=1000000;i=i*2,j++)      dou[j]=i;    cin>>n;    findd(n,0);    cout<<num;    return 0;}


//然后大神找的规律

#include <iostream>#include<cstring>using namespace std;int dou[25];int num[25];const int maxn=1000010;long long dp[maxn];int main(){    int n;     while(cin>>n)     {         dp[0]=1;         dp[1]=1;         for(int i=2;i<=n;i++)         {             if(i%2!=0)             dp[i]=dp[i-1]%10000000000;//还不不懂这个100000000的意义所在             else                dp[i]=(dp[i/2]+dp[i-1])%1000000000;         }  cout << dp[n]<< endl;     }     return 0;}


                                             
0 0
原创粉丝点击