輸入正整數n (n ζ10000) ,求將n 寫成若干個正整數的立方之和有多少種方法。
比如21 有3 種寫法: 21=13+13+13+...+13=23+13+13+13+...+13=23+23+13+13+ 13+ 13+ 1 3 。
77 有22 種寫法, 9999 有440022018293 種寫法。
分析:建立多段圖。結點d(i,j)表示"使用不超過i 的整數的立方,累加和爲j" 這個狀態,設d(iJ)爲從(0,0)到(iJ)的路徑條數,則最終答案爲d(21,n) (因爲對於題目範圍, 22^3>n) 。這個多段圖的特點是每個結點一步只能走到下一個階段的結點,因此我們可以一個階
段一個階段的計算,代碼如下。
實際上每次都是從左向右遞增覆蓋的,二維數組可以降爲一維。
#include <cstdio>
const int N = 10000, I = 21;//22^3 = 10648
long long d[N+5];
int main(int argc, char** argv) {
int n;
d[0] = 1;
for(int i = 1; i <= I; i++)
for(int j = 0; j+i*i*i <= N; j++)
d[j+i*i*i] += d[j];
while( ~scanf("%d",&n))
printf("%lld\n",d[n]);
return 0;
}