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

动态规划问题 -- 求给定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];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值