2012-11-20 19 views
2

是否有任何算法可以找出有多少種寫法的方法,例如n,功率和爲2?將n寫爲2的冪的和的方法的數量

例如:4,有四種方式:

4 = 4 
4 = 2 + 2 
4 = 1 + 1 + 1 + 1 
4 = 2 + 1 + 1 

感謝。

+0

你想區分4 = 2 + 1 + 1和4 = 1 + 1 + 2還是那些被視爲相同? – pjwilliams

+0

你已經解決了1,2,3,4,5,6,7,看看是否出現一個微不足道的模式? – Brandon

+0

謝謝,不,我不想區分它們。我看到了一個像fibo算法的模式,但我不確定。 –

回答

3

假設G(M)是書寫方式米爲2的冪我們使用的總和數量f(m,k)表示寫入m的方式的數量作爲2的冪的和,並且所有數字的冪小於或等於k。然後我們就可以減少對等式:

if m==0 f(m,k)=1;  
if k<0 f(m,k)=0;  
if k==0 f(m,k)=1;  
if m>=power(2,k) f(m,k)=f(m-power(2,k),k)+f(m,k-1);//we can use power(2,k) as one of the numbers or not.  
else f(m,k)=f(m,k-1); 

以6爲例:

g(6)=f(6,2) 
=f(2,2)+f(6,1) 
=f(2,1)+f(4,1)+f(6,0) 
=f(0,1)+f(2,0)+f(2,1)+f(4,0)+1 
=1+1+f(0,1)+f(2,0)+1+1 
=1+1+1+1+1+1 
=6 

這裏是下面的代碼:

#include<iostream> 
using namespace std; 

int log2(int n) 
{ 
    int ret = 0; 
    while (n>>=1) 
    { 
     ++ret;  
    } 
    return ret; 
} 

int power(int x,int y) 
{ 
    int ret=1,i=0; 
    while(i<y) 
    { 
     ret*=x; 
     i++; 
    } 
    return ret; 
} 

int getcount(int m,int k) 
{ 
    if(m==0)return 1; 
    if(k<0)return 0; 
    if(k==0)return 1; 
    if(m>=power(2,k))return getcount(m-power(2,k),k)+getcount(m,k-1); 
    else return getcount(m,k-1); 

} 

int main() 
{ 
    int m=0; 
    while(cin>>m) 
    { 
     int k=log2(m); 
     cout<<getcount(m,k)<<endl; 
    } 
    return 0; 
} 

希望它能幫助!

+0

非常好....謝謝你。 –

相關問題