• 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;
    }
  • 相关阅读:
    python 之 sys.argv 外部传参动态匹配内部字典
    我是如何打败拖延症的
    图解Docker容器和镜像
    docker1-安装和使用
    python操作RabbitMQ
    Python操作 Memcache、Redis
    python队列、线程、进程、协程
    项目协作与工作流程规范
    python26:自定义form表单验证
    s11d27 算法
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2914800.html
Copyright © 2020-2023  润新知