zoukankan      html  css  js  c++  java
  • UVA 357 Let Me Count The Ways(全然背包)

    UVA 357 Let Me Count The Ways(全然背包)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=293

    题意:

           有5种硬币: 1分 5分 10分 25分 和50分. 如今给你一个面值n, 问你有多少种方法能利用上述硬币组合出n分的金钱.

    分析:

           典型的全然背包问题.

           本题的限制条件: 硬币钱数正好等于n

           本题的目的条件: 求有多少种组合方法.

           所以我们令dp[i][j]==x 表示用前i种硬币来构造j分金钱一共同拥有x种方法.

           初始化: dp为全0. 但dp[0][0]=1.

           状态转移: dp[i][j] = sum( dp[i-1][j] , dp[i][j-val[i]])

           前者表示第i种硬币一个都不选, 后者表示至少选1个第i种硬币来用.

           终于所求: dp[5][n].

           程序实现用的滚动数组, 逆序递推. 所以dp仅仅有[j]这一维.

    AC代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 30000+5;
    
    int n=5;
    int val[]={1,5,10,25,50};
    long long dp[maxn];
    
    int main()
    {
        //初始化
        memset(dp,0,sizeof(dp));
        dp[0]=1;
    
        //递推
        for(int i=0;i<n;i++)
        {
            for(int j=val[i];j<maxn;j++)
                dp[j] += dp[j-val[i]];
        }
    
        //处理每一个输入
        int x;
        while(scanf("%d",&x)==1)
        {
            if(dp[x]==1) printf("There is only 1 way to produce %d cents change.
    ", x);
            else printf("There are %lld ways to produce %d cents change.
    ",dp[x],x);
        }
    
        return 0;
    }
    

  • 相关阅读:
    [ZROI 9.16模拟赛] Tutorial
    [ZROI 9.15模拟赛] Tutorial
    [USACO 2017 Open Gold] Tutorial
    [USACO 2017 Feb Gold] Tutorial
    [USACO 2017 Jan Gold] Tutorial
    [BZOJ 1208] 宠物收养所
    [BZOJ 1500] 维护序列
    多表查询
    sql查询语句查询顺序
    单表查询
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6699102.html
Copyright © 2011-2022 走看看