ååãä»ãã¦ããããã°ã©ãã³ã°ã®ã¯ã¤ãºããã£ã¦ããã®ã§ææ¦ãã
æ£è§£ã ã£ããã©æ®å¿µãªããååã¯ããããorz
ãã£ãããã£ãã®ã§ããã°è¨äºã«ãã¦ãã
å
¬éãã¦ããã®ãããããããªããã©ãã¾ããã£ããæ¶ãã¾ã
åé¡
2åã3åã5åãâ¦â¦ã¨ãã£ããããæ°çãªä¾¡å¤ã®ç¡¬è²¨ãããã¨ãã«100ä¸åãæ¯æãæ¹æ³ãä½ç¨®é¡ããã®ããçãã
解æ³
åé¡ãèªãã§ããã«è»æ¬ã§èªãã åå²æ°ã®åé¡ã«ä¼¼ã¦ããã¨æãã¾ãã
åå²æ°ã¯ããèªç¶æ°ãèªç¶æ°ã®åã¨ãã¦ä½éãã§è¡¨ããããã¨ããåé¡ã§ã
åå²æ°ã¯åçè¨ç»æ³ã§è¨ç®ãããã¨ãã§ãã¾ã
ä»åã®åé¡ã¯åãä½ãã¨ãã«ä½¿ããæ°ã«å¶éãããåå²æ°ã®è¨ç®ã¨èãããã¨ãã§ãã¾ãã
åæ§ã«åçè¨ç»æ³ã§è¨ç®ãã¾ãã
\(i\)種é¡ç®ã¾ã§ã®ç¡¬è²¨ã好ããªåæ°ä½¿ã£ã¦\(j\)ã表ããæã®çµã¿åããã®æ°ã\(dp[i][j]\)ã¨ãã¾ãã
\(i\)種é¡ç®ã®ç¡¬è²¨ã\(F[i]\)ã¨ããã¨ã\(dp[i][j] = dp[i - 1][j] + dp[i][j - F[i]]\)ã®é¢ä¿ãæãç«ã¡ã¾ã
ããã¯\(i\)種é¡ç®ã¾ã§ã§\(j\)ã表ããæã®çµã¿åããã®æ°ã¯ã\(i - 1\)種é¡ç®ã¾ã§ä½¿ã£ãæã®çµã¿åããã®æ°ã¨å ãã¦\(F[i]\)ã使ã£ãæã®çµã¿åããã®æ°ã®åã§ãããã¨ã表ãã¦ãã¾ãã
ãã¨ã¯ãããé ã«è¨ç®ãã¦ããã ãã§ã
ã½ã¼ã¹ã³ã¼ã
M = 1000000 F = [2, 3] while F[-1] + F[-2] <= M: F.append(F[-1] + F[-2]) L = len(F) temp = [0] * (M + 1) dp = [temp[:] for i in xrange(2)] dp[0][0] = 1 for i in xrange(L): for j in xrange(M + 1): dp[1][j] = dp[0][j] if j - F[i] >= 0: dp[1][j] += dp[1][j - F[i]] dp[0] = dp[1] dp[1] = temp[:] print dp[0][-1]