我一直在尋找Number of ways to write n as a sum of powers of 2,它工作得很好,但我想知道如何提高該算法的運行時效率。它在任何合理的時間內(10秒以內)都不能計算超過〜1000的任何東西。在有效時間內寫入正整數的方法總數爲2的冪的總和
我假設它與分解成子問題有關,但不知道如何去做。我在想像O(n)或O(nlogn)運行時 - 我確信它可能以某種方式。我只是不知道如何有效地分工。通過Chasefornone
代碼
#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;
}
請向我們展示您的代碼... – NINCOMPOOP 2013-05-08 05:02:17
如果您至多可以使用一次兩次冪,那麼答案是一個常數:1。否則,僅僅爲了兩權而解決問題就足夠了。 – 2013-05-08 05:08:38
編輯添加代碼 - 來自Chasefornone - 不是我自己的。 – user1804784 2013-05-08 05:09:10