HOJ 10444 The milliard Vasya's function(簡單揹包)
阿新 • • 發佈:2019-01-23
在不大於1000000000的數裡,各個數位上的數字之和為s的數有多少個。
很容易想到通過揹包來做,但是如果只是簡單按數位遞推,如何排除0112和112這種重複的情況呢?
處理的辦法是不把0作為物品,但位數i不僅僅從i-1遞推,而是從0到i-1都要統計進來。
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <math.h> using namespace std; int dp[10][82]; void init() { memset(dp, 0, sizeof(dp)); for(int k = 0; k < 10; k++) dp[k][0] = 1; for(int i = 0; i < 10; i++) dp[1][i] = 1; for(int k = 2; k < 10; k++) for(int t = 0; t < k; t++) for(int i = 1; i < 10; i++) for(int j = i; j < 82; j++) dp[k][j] += dp[t][j - i]; } int s; int main() { // freopen("10444.in", "r", stdin); init(); while(scanf("%d", &s), s) { int ans = dp[9][s]; if(s == 1) ans++; printf("%d\n", ans); } return 0; }