【TOJ 3206】 Dairy Queen【DP】

本文介绍了一种解决背包问题的动态规划方法,通过无限数量的几种价值钱币组成特定金额,探讨了所有可能的组合方式。使用C++实现算法,并详细展示了状态转移的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

#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]);
     }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值