We can solve the previous problem by using combinations as shown below:
void CoinCount(ref List<int> coins, ref List<int>change, int amount, int start, int level)
{
for (int I = start; I < amount; I++)
{
for (int j = 1; i < coins.Count() && j <= amount/coins[I]; j++)
{
for (int k = 0; k < j; k++){
change[level+k] = coins[i];
}
if (change.sum() == amount) Console.WriteLine("{0} with {1} elements", change.ToString(),
change.Count());
if (change.sum() < amount)
CoinCount( ref coins, ref change, n, start+1, level+j);
for(int k = 0; k <j; k++){
change[level+k] = 0;
}
}
The dynamic programming approach is as follows:
//
// returns the maximum sum that cannot be met by the given coins
//
public int CoinSumDP(List<int> coins, ref List<int> change, int amount, int start, int end) // start is for the type of coins and end is for the number of same coin and all coins appear in sorted duplicate manner and using start,end for contiguity start = 0; end = change.Count [start,end] range initialized to zero
{
//pseudo code
if (coins.Count() == 1) return Coins[0];
int sum = 0;
for (int i = 0; i < Coins.Count(); i++)
var q = CoinSumDP(Coins.ChooseK(), ref change, amount, start, end) +
CoinSumDP(Coins[start].Repeat(end-start), ref change, amount, start, end)
if q > sum
sum = q
return Sum;
}
void CoinCount(ref List<int> coins, ref List<int>change, int amount, int start, int level)
{
for (int I = start; I < amount; I++)
{
for (int j = 1; i < coins.Count() && j <= amount/coins[I]; j++)
{
for (int k = 0; k < j; k++){
change[level+k] = coins[i];
}
if (change.sum() == amount) Console.WriteLine("{0} with {1} elements", change.ToString(),
change.Count());
if (change.sum() < amount)
CoinCount( ref coins, ref change, n, start+1, level+j);
for(int k = 0; k <j; k++){
change[level+k] = 0;
}
}
The dynamic programming approach is as follows:
//
// returns the maximum sum that cannot be met by the given coins
//
public int CoinSumDP(List<int> coins, ref List<int> change, int amount, int start, int end) // start is for the type of coins and end is for the number of same coin and all coins appear in sorted duplicate manner and using start,end for contiguity start = 0; end = change.Count [start,end] range initialized to zero
{
//pseudo code
if (coins.Count() == 1) return Coins[0];
int sum = 0;
for (int i = 0; i < Coins.Count(); i++)
var q = CoinSumDP(Coins.ChooseK(), ref change, amount, start, end) +
CoinSumDP(Coins[start].Repeat(end-start), ref change, amount, start, end)
if q > sum
sum = q
return Sum;
}
No comments:
Post a Comment