問題是:如果序列中的所有數字總和爲n,最少2個數字可以產生多少個序列。解決「分區函數Q」或總和爲n的序列總數的有效方法
http://mathworld.wolfram.com/PartitionFunctionQ.html
使用方程here *我能得到以下功能:
public static int GetSequences(int n, int k) {
if(n <= k) return 0;
int result = 1;
for(int i = k + 1; i < n; i++) {
result += GetSequences(n - i, i);
}
return result;
}
但解決時間指數有n。在n = 180
左右,完成時間可能需要10秒以上。
我已經嘗試使用散列表來存儲以前解決的值,但我得到非常野生的結果。
static Map<Long,Long> cache = new HashMap<Long,Long>();
public static int solve(int n) {
for(int i = 3; i <= n; i++) {
cache.put((long)i, (long)GetSequences(i, 0));
}
return cache.get((long) n).intValue() - 1;
}
public static int GetSequences(int n, int k) {
if(n <= k) return 0;
if(cache.containsKey((long)k)) {
return cache.get((long)k).intValue();
}
int result = 1;
for(int i = k + 1; i < n; i++) {
result += GetSequences(n - i, i);
}
return result;
}
如何提高效率以便更快地生成序列總數?
*:爲了使GetSequences(n,k)
功能,解決了鏈路的問題,其結果必須由1減去到帳戶的序列[n,0]
「我已經嘗試使用散列圖來存儲以前解決的值,但我得到了非常狂野的結果。」 - 你有一個錯誤。不管它是什麼,找到它並修復它。 – user2357112
@ user2357112我加入了我以前爲hashmaps做過的事情,我會更深入地探究導致問題的原因。 – Clint
我很確定多頭不會在這裏削減它。 – user2357112