动态规划问题 -- 求给定K个币种时N美元有几种组合方式 (例1,2,3美元存在,求10美元有几种组合方式)

递推公式:

额度为j的美元 组合总数 =  在没有本次最大美元币种为i的上一次的情况下,额度为j的美元有几种组合 + 想要的额度为j的美元总数减去本次新增的最大的美元币的情况下,有多少种组合(这样的情况下,只把这样的组合简单加上一个最大美元币,就是一种新的组合,也可以满足总额度要求)

实际例子:

比如说只有1 2 3美元币, 想要5美元,组合方式为:只有1 2美元币时5美元的组合数 + (5-3)美元的组合数,这样在加上一张3美元币就可以是一种新的组合,也会满足要求。也就是说,有3美元存在的情况下,其它2美元组成5美元的组合数个数,就是3美元存在时新增加的组合数,仔细体会一下!

// kanapsack_Making_N_Dollars.cpp : Defines the entry point for the console application.

#include <stdio.h>
// (1 ≤ N ≤ 1000, 1 ≤ K ≤ 100)
#define MAX_DIVID_OVERFLOW 100000000
#define MAX_INPUT_DOLLAR 1000
int Solution[MAX_INPUT_DOLLAR+1]; //Knapsack problem

int integer_seperate( int TotalDollar, int SubDollar)
{
    int i,j;
    for( i = 0; i<=TotalDollar; i++ )
    {
        Solution[i] = 0;
    }
    
    Solution[0]=1;

//给定的美元币种有几种,从最小的1美元开始循环到给定的最大的美元币种。
    for(i=1; i<=SubDollar; i++)
    {
            for(j=i; j<=TotalDollar; j++)
            {
                //额度为j的美元 组合总数 =  在没有本次最大美元币种为i的上一次的情况下,额度为j的美元有几种组合 + 想要的额度为j的美元总数减去本次新增的最大的美元币的情况下,有多少种组合(这样的情况下,
                //只把这样的组合简单加上一个最大美元币,就是一种新的组合,也可以满足总额度要求)
                //比如说只有1 2 3美元币, 想要5美元,组合方式为:只有1 2美元币时5美元的组合数 + (5-3)美元的组合数,这样在加上一张3美元币就可以是一种新的组合,也会满足要求。
                Solution[j]= (Solution[j]+Solution[j-i])%MAX_DIVID_OVERFLOW;
            }
    }
    printf("Method 1 Solution[%d]=%d\n",TotalDollar,Solution[TotalDollar]);

for( i = 0; i<=TotalDollar; i++ )
    {
        Solution[i] = 1;
    }

return Solution[TotalDollar];
}

动态规划问题 -- 求给定K个币种时N美元有几种组合方式 (例1,2,3美元存在,求10美元有几种组合方式)相关推荐

  1. python动态规划算法最大k乘积_C语言使用DP动态规划思想解最大K乘积与乘积最大问题...

    最大K乘积问题设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k,求出I的最大k乘积. 编程任务: 对于给定的I 和k ...

  2. Dijkstra(迪杰斯特拉)算法:求给定顶点到其余各顶点的最短路径

    算法特点:该算法使用广度优先搜索解决了赋权有向图或者无向图的单源点最短路径问题.(求给定顶点到其余各点的最短路径问题) 算法思路:Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源 ...

  3. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...

  4. 树状数组与离散化与求第K大模板

    树状数组模板: //Cnt为数组的界 //cnt[i]为编号或者数值上小于id的数量 void Update(LL Id) {while(Id<=Cnt){cnt[Id]++;Id+=lowbi ...

  5. A*算法的认识与求第K短路模板

    现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...

  6. 借组磁带机求第K小元素

    如果输入在磁带机上, 你的机器只有一个磁带机驱动器和几十字的内存,如何找第K小的数 1. 遍历一遍磁带,随即选择一个数M 2. 再遍历一遍磁带, 计算大于和小于M的个数,这样就可以获得数M在总序列中的 ...

  7. 无序数组求第k大的数 python_整数无序数组求第K大数

    import java.util.Scanner; /** * 类似与求第k小的问题 * 求第k大相当于求第n-k+1小,n为数组长度 * * 著名的BFPRT算法可保证在线性时间内得到结果. * h ...

  8. 选择问题(求第k个最小元素)

    什么是选择问题 划分的思路 Lomuto 划分 利用划分求第k小元素 C语言实现 改进 参考资料 什么是选择问题 选择问题(selection problem)是求一个n个数列表的第k个最小元素的问题 ...

  9. 【最详细】BFPRT算法:时间复杂度O(n)求第k小的数字

    去年写了一篇对快排进行改进的算法,可以在时间复杂度 O(n)O(n)O(n)的情况下,找到第kkk小的数字. 那时候,我还不知道这个算法叫BFPRT算法--现在知道了,还知道它又被称为中位数的中位数算 ...

最新文章

  1. 【gin-04】 GIN-快速开始
  2. shell usage file
  3. python2 中使用pip2 install package_name的时候报错:AttributeError: ‘int‘ object has no attribute ‘endswith‘
  4. SQL_CALC_FOUND_ROWS的用法
  5. Springboot 传递 List「Long」 IdList
  6. [Linux]Linux下经常会用到的简单实例(持续更新)
  7. 【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
  8. python打开鼠标指定文件夹_学会python文件操作,鼠标好像没用了,学习python第10天...
  9. 激活MyEclipse 6.5方法-通过一段Java程序生成激活码
  10. RocketMQ(一)RocketMQ介绍及核心概念
  11. 电脑全能工具箱,400+工具免费用
  12. 有人30岁转型做Android开发,老罗android开发视频教程
  13. springboot大学生实习管理系统
  14. Ubuntu16.04安装Meshlab
  15. BES2300x笔记(30) -- ANC降噪原理与通道配置
  16. linux开机自检时间长,Linux 开机自检的设置(tune2fs和fsck)
  17. 深入浅出SpringBoot2.x
  18. 因为涉嫌歧视女性被开除的那位工程师到底在备忘录上写了什么?
  19. SSH攻击ip列表【不定时更新】
  20. 修改服务器网卡速率,linux查看网卡速率命令(linux如何改网卡速率命令)

热门文章

  1. 视频配音怎么制作?手把手教你配音视频制作
  2. Auto.js Pro 调起APP并跳转至指定页面
  3. 一名中专生的坎坷程序人生
  4. 暗影精灵2pro装Linux系统,暗影精灵2不支持linux双系统吗?
  5. kvm安装Windows7旗舰版
  6. 获取与设置checkbox选中状态
  7. Android中EditText优先弹出数字输入法
  8. 高兴,今天总算鸟枪换炮了~
  9. 磁盘概念-Fidisk-Parted
  10. 电脑如何打开EPUB文件