动态规划问题 -- 求给定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];
}