static void Main(string[] args)
{
// 只能用一次
//IList<HUOWU> hUOWUs = new List<HUOWU>{
// new HUOWU(1,1),new HUOWU(2,5),new HUOWU(3,4),
// new HUOWU(6,7),new HUOWU(8,12),new HUOWU(9,15)
//};
//int bag = 10;
//var rt = MaxValue(bag, hUOWUs);
//Console.WriteLine($"最高:{rt}");
// 纸张不可以无限使用
int[] coins = { 5, 2, 3, 5 };
int amount = 5;
int n = coins.Length;
int[,] dp = new int[n + 1, amount + 1];
dp[n, 0] = 1;
var rt = Change2(coins, amount, dp);
//var rt = Change1(coins, amount);
//
Console.WriteLine(rt);
Console.ReadKey();
}
static int Change2(IList<int> coins,int amount, int[,] dp) {
// 正下方 + index + 1, rest - coins[index]
for (int index = coins.Count - 1; index >= 0; index--)
{
for (int rest = 0; rest <= amount; rest++)
{
dp[index, rest] = dp[index + 1, rest] + (rest - coins[index] >= 0 ? dp[index + 1, rest - coins[index]]:0);
}
}
return dp[0, amount];
}
static int Change1(IList<int> coins, int amount)
{
if (amount <= 0) return 0;
if (coins.Count() <= 0) return 0;
return Process1(coins, 0, amount);
}
static int Process1(IList<int> coins, int index, int rest)
{
if (rest < 0) return 0;
if (index == coins.Count()) return rest == 0 ? 1 : 0;
return Process1(coins, index + 1, rest) + Process1(coins, index + 1, rest - coins[index]);
}