zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    IE的有条件注释
    JavaScript 正则表达式判断是否有小数点
    设置<li>前边圆点样式
    CSS3 Gradient
    z-index
    Linux下weblogic启动报错unable to get file lock的问题
    Linux下启动关闭weblogic
    Java 自动装箱与拆箱(Autoboxing and unboxing)
    jquery怎么跳出当前的each循环
    Integer与int的种种比较你知道多少
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2914800.html
Copyright © 2011-2022 走看看