【TOJ 3206】 Dairy Queen【DP】

11 篇文章 0 订阅
题目大意:给你几种价值的钱币,问能有几种组合方式可以组成所给的钱数(每种钱币假设有无限多个)

题解:简单的背包问题 状态以及转移方程见代码注释

#include <cstdio>
  #include <cstring>
  #include <algorithm>
  
  using namespace std;
  
  int dp[302], ans[302];//dp[i]表示钱数到达i的方法个数;
  int n, c[10], cnt;
  //利用动态规划的思想来解题;
 int main()
 {
     int j, i, k, tem;
    while (scanf ("%d%d", &n, &cnt) != EOF)
    {
           memset (dp, 0, sizeof (dp));
          memset (ans, 0, sizeof (ans));
          for (i = 0;i < cnt;i++) scanf ("%d", &c[i]);
           for (i = 0;i <= n;i += c[0]) ans[i] = 1;
          for (i = 1;i < cnt;i++)
           {
              for (j = 0;j <= n;j++)
               {
                  for (k = 0;k + j <= n;k += c[i])
                       dp[k + j] += ans[j];
               }
               for (j = 0;j <= n;j++) ans[j] = dp[j], dp[j] = 0;//每一次循环后都要重新赋值,避免重复; 
           }
           printf ("%d\n", ans[n]);
     }
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值