網址:https://www.luogu.com.cn/problem/P1679ios
在你的幫助下,v神終於幫同窗找到了最合適的大學,接下來就要通知同窗了。在班級裏負責聯絡網的是dm同窗,因而v神便找到了dm同窗,可dm同窗正在忙於研究一道有趣的數學題,爲了請dm出山,v神只好請你幫忙解決這道題了。spa
題目描述:將一個整數m分解爲n個四次方數的和的形式,要求n最小。例如,m = 706, 706 = \(5^4\) + \(3^4\), 則n = 2。code
一行,一個整數m。get
一行,一個整數n。數學
706
2
數據範圍:對於100%的數據,m<=100,000string
這道題估計一下,最大的數不會比18大。所以,預處理18以前數的四次方。接下來徹底揹包。注意預處理。io
代碼以下:class
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; const int c[17] = {1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 14641, 20736, 28561, 38416, 50625, 65536, 83521}; int m, dp[100000]; int main() { scanf("%d", &m); memset(dp, 0x3f, sizeof(dp)); dp[0] = 0; for(int i = 1; i <= m; ++ i) { for(int j = 0; j < 17; ++ j) { if(i >= c[j]) dp[i] = min(dp[i], dp[i - c[j]] + 1); } } printf("%d\n", dp[m]); return 0; }