uva 674 && hdu 2069 coin change(水完全背包)

19 篇文章 2 订阅


题目的意思就是有1,5.10.25.50面值的硬币..

组成目标值的方法有多少种..

首先我们可以想到,用这些硬币组成11有多少种.

就是组成10的种数,加上组成6的种数,加上组成1的种数,因为这些面值都是加上一枚硬币就得到11了.

然后我们又能继续去求1组成10的种数,那么明显就是9,5,0的组成数的和.

依次递归.并且每次都用d 数组记录下来,防止重复计算.

而d数组是二维的,第二维是用来防止多算,比如拿了1再拿5,和拿了5再拿1只能算一种.,所以我们算的时候,必须从小到大取,你不能去 1 ,5 , 1 ,只能取 1 ,1 ,5 .接下去算的那一个只能大于等于前一个 ,所以d[ 11 ][ 0 ],后面那个小标代表用到哪一个了..如果是d[ 9][ 1] ,就代表,还差9分钱,而你能取得硬币只有5.10.25.50这四种面值了..


很水的背包dp计数。。。以前背包都是求最大值,用max,现在求方案数就直接 += 就好了。。为什么+= 上面红字说的比较好

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1e5;
int dp[maxn], n, v[5] = {1, 5, 10, 25, 50};
int main()
{
    while(~scanf("%d", &n))
    {
        memset(dp, 0, sizeof(dp));
        dp[0] = 1;
        for(int i = 0; i < 5; i++)
            for(int j = v[i]; j <= n; j++)
            {
                dp[j] += dp[j-v[i]];
            }
        printf("%d\n", dp[n]);
    }
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值