1. 程式人生 > >HOJ 10444 The milliard Vasya's function(簡單揹包)

HOJ 10444 The milliard Vasya's function(簡單揹包)

在不大於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;
}