C++ 修改硬币更换问题以跟踪使用的硬币(不是最小数量)
我编写了一个简单的硬币兑换算法,目前可以找到与购买物品所需金额相匹配的最小硬币数量。我正试图修改它,这样它就可以跟踪每种面额硬币的最小使用数量,而我的数量有点不足。因此,如果你将数字6传递给函数,它会说所需的最小硬币数是2(我已经记下了),这样做的硬币组合是4分硬币和2分硬币。这是我的密码:C++ 修改硬币更换问题以跟踪使用的硬币(不是最小数量),c++,dynamic-programming,coin-change,C++,Dynamic Programming,Coin Change,我编写了一个简单的硬币兑换算法,目前可以找到与购买物品所需金额相匹配的最小硬币数量。我正试图修改它,这样它就可以跟踪每种面额硬币的最小使用数量,而我的数量有点不足。因此,如果你将数字6传递给函数,它会说所需的最小硬币数是2(我已经记下了),这样做的硬币组合是4分硬币和2分硬币。这是我的密码: coins[5] = {1, 2, 4, 17, 28} //effectively kills any use of greedy algortihms count[m]; int coins_neede
coins[5] = {1, 2, 4, 17, 28} //effectively kills any use of greedy algortihms
count[m];
int coins_needed_for(int m) {
//Initilization- fills array w/ -1s
for (int z = 1; z < m+1; z++) {
count[z] = -1;
}//for
//fills in appropriate values
for (int j = 0; j < 5; j++) {
if (coins[j] < m)
count[coins[j]] = 1;
else if (coins[j] == 1)
return 1;
else
break;
}//for
//Execution
for (int p = 1; p < m+1; p++) {
if (count[p] == -1) {
int min = 10000 //poor subsitute for infinity;
for (int i = 0; i < 5; i++) {
if (coins[i] <= p) {
if (count[p-coins[i]] + 1 < min) {
min = count[p-coins[i]] + 1;
}
}//if
count[p] = min;
}//for
}//if
}//for
return count[m];
}
coins[5]={1,2,4,17,28}//有效地阻止贪婪算法的使用
计数[m];
需要的整数硬币(整数m){
//初始化-填充数组w/-1s
对于(intz=1;z 如果(coins[i]你可以使用除法和模来做得更简单。我来举个例子
afterQuarterTotal = totalAmount % 25;
numberOfQuarters = (totalAmount - afterQuarterTotal) / 25;
afterDimeTotal = aftgerQuarterTotal % 10;
numberOfDimes = (afterQuarterTotal - afterDimeTotal) / 10;
afterQuarterTotal=总金额%25;
numberOfQuarters=(总额-季度后总额)/25;
afterDimeTotal=AfterQuarterTotal%10;
numberOfDimes=(afterQuarterTotal-AfterDimesTotal)/10;
等等…这是一个非常古老的问题,被称为“变革问题”。看看有什么要说的
这是背包问题的一种形式,它不是一个简单的问题。void recursive\u程序(int coins)
void recursive_program(int coins)
{
int times;
if (coins==0)
return;
if (coins>=28)
{
times=coins/28;
cout<<times;
cout<<" * 28 for\t\t"<<times*28<<endl;
return recursive_program(coins%28);
}
if (coins>=17)
{
times=coins/17;
cout<<times;
cout<<" * 17 for\t\t\t "<<times*17<<endl;
return recursive_program(coins%17);
}
if (coins>=4)
{
times=coins/4;
cout<<times;
cout<<" * 4 for\t\t\t "<<times*4<<endl;
return recursive_program(coins%4);
}
if (coins>=2)
{
times=coins/2;
cout<<times;
cout<<" * 2 for\t "<<times*2<<endl;
return recursive_program(coins%2);
}
if (coins>=1)
{
times=coins/1;
cout<<times;
cout<<" * 1 for\t\t\t\t "<<times<<endl;
coins=0;
return recursive_program(coins);
}
}
{
整数倍;
如果(硬币=0)
返回;
如果(硬币>=28)
{
次=硬币/28;
cout/*
硬币兑换问题
输入规格:
第一行预期的金额
第二行预计硬币的数量
第三行包含按面值升序排列的硬币
假设硬币供应无限
输出规格:
每个箱子都会先展示最低面额的硬币,然后再展示下一个最高面额的硬币。
箱子用线隔开
如果找不到总和,则打印-1
*/
#包括
使用名称空间std;
int*num,*coins,*maxC,n,amount,flag=0,stop=0;
整数和()
{
int i=0,j;
整数和=0;
对于(i=0;只有当你可以使用贪婪算法时,它才起作用。对于硬币,使用17
和28
时,你不能这样做。啊……我明白了。如果我使用的是标准的美国货币体系,这会很好,但我不是。如果你输入一个像34这样的值,我的算法会正确地识别出你需要两个硬币来做,但它会这么说它需要1 28美元、1 4美元和1 2美元。回到绘图板上!欢迎来到这里,这里是一个很好的实践,可以解释为什么使用您的解决方案,而不仅仅是如何使用。这将使您的答案更有价值,并有助于进一步的读者更好地理解您是如何操作的。我还建议您查看我们的常见问题解答:。您也可以随时“编辑”您自己的帖子可以添加更多信息或更正错误。:)
#include<iostream>
using namespace std;
int *num,*coins,*maxC,n,amount,flag=0,stop=0;
int sum()
{
int i=0,j;
int sum=0;
for(i=0;i<n;++i)
for(j=0;j<num[i];++j)
sum+=coins[i];
return sum;
}
void print()
{
int i,j;
for(i=0;i<n;++i)
{
for(j=0;j<num[i];++j)
cout<<coins[i]<<" ";
}
cout<<endl;
}
void printNum()
{
int i;
for(i=0;i<n;++i)
cout<<num[i]<<" ";
cout<<endl;
}
void nextIter()
{
int i,j;
int stat=0;
//printNum(); //Remove the comment if you want to see the values of num array in every iteration
for(i=0;i<n;++i)
{
if(num[i]==0)
stat=1;
else
{
stat=0;
break;
}
}
if(stat)
{
stop=1;
return ;
}
for(i=n-1;i>=0;--i)
{
int dec=0;
if(num[i]==0)
{
dec=1;
num[i]=maxC[i];
}
else
{
--num[i];
return ;
}
}
}
int find()
{
while(!stop)
{
if(amount==sum())
{
flag=1;
print();
}
nextIter();
}
}
int main()
{
int i;
cout<<"\nEnter amount:";
cin>>amount;
cout<<"\nEnter number of coins:";
cin>>n;
coins=new int[n];
maxC=new int[n];//contains maximum number of each denomination required
num=new int[n];//contains current number of each denomination required
for(i=0;i<n;++i)
{
cin>>coins[i];
num[i]=maxC[i]=amount/coins[i];
}
find();
if(!flag)
cout<<"-1";
cout<<endl;
system("pause");
return 0;
}