c/ C
来源:互联网 发布:知即墨下载 编辑:程序博客网 时间:2024/06/02 02:14
用递归写的,然后超时了,知道应该去找规律,可是。。。。没找到尴尬
C - Sumsets
1) 1+1+1+1+1+1+12) 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