uva 10943 How do you add?

递推

题意:给出n和k,用k个数字(可以相同)使他们的和为n,问有多少种方案数,其中好像a+b,b+a这种算为两种方案,也就是考虑排列

这个问题用递推来做,按位递推。dp[c][s]表示在利用c个数字的条件下相加得s的方案数

dp[c][s]=dp[c-1][s]+dp[c-1][s-1]+dp[c-1][s-2]……dp[c-1][0]

另外需要初始化

无论多少位,相加和位0的话方案数是1,即全部为0,所以dp[c][0]=1

另外当只有一个数字时要相加和为s,方案数也是1,即只能填s本身,dp[1][s]=1

然后就可以开始递推了

我是用记忆化搜索来写的

#include <cstdio>
#include <cstring>
#define MOD 1000000
#define N 110

long long dp[N][N];
int n,m;

void dfs(int c , int s)  //dp[c][s]在c位内构建出s
{
    if(dp[c][s]!=-1) return ;

    dp[c][s]=0;
    for(int i=0; i<=s; i++) //当前位能填的数字
    {
        dfs(c-1,s-i);  //在剩下的c-1位中要构建出s-i
        dp[c][s]=(dp[c][s]+dp[c-1][s-i])%MOD;
    }
    return ;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(!n && !m) break;
        memset(dp,-1,sizeof(dp));
        for(int i=1; i<=m; i++) dp[i][0]=1;
        //要构建出0的方案数必定为1
        for(int i=0; i<=n; i++) dp[1][i]=1;
        //当只有1位时构建的方案数也是1,唯一的
        dfs(m,n);
        printf("%lld\n",dp[m][n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/scau20110726/p/2914800.html