Ingenuous Cubrency UVA - 11137 立方數之和 遞推

輸入正整數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;
}

 

發佈了499 篇原創文章 · 獲贊 598 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章