把一张面值为一元的纸币,换成一分,二分,五分的硬币,共有多少种换法?编程输出每一种不同的算

把一张面值为一元的纸币,换成一分,二分,五分的硬币,共有多少种换法?编程输出每一种不同的换法。 

如果每种硬币至少有一个,编程求出所需硬币最少的数目及换法 

Code:
  1. #include<iostream>  
  2. #include<iomanip>  
  3. using namespace std;  
  4. struct coin  
  5. {  
  6.    int a;  
  7.    int b;  
  8.    int c;  
  9.    int num;  
  10. }coin[600],min;  
  11.   
  12. void main()  
  13. {  
  14.    int i,j,k,m=0;    
  15.    min.num=100;  
  16.    for(i=0;i<=20;i++)  
  17.    {  
  18.       for(j=0;j<=50;j++)  
  19.       {  
  20.          for(k=0;k<=100;k++)  
  21.          {  
  22.             if(i*5+j*2+k==100)  
  23.             {  
  24.               coin[m].a=i;  
  25.               coin[m].b=j;  
  26.               coin[m].c=k;  
  27.               coin[m].num=i+j+k;  
  28.               if(i!=0&&j!=0&&k!=0&&coin[m].num<min.num)  
  29.               {  
  30.                   min.a=i;  
  31.                   min.b=j;  
  32.                   min.c=k;  
  33.                   min.num=coin[m].num;  
  34.               }  
  35.               m++;  
  36.             }  
  37.          }  
  38.       }  
  39.    }  
  40.    j=0;  
  41.    for(i=0;i<m;i++)  
  42.    {  
  43.       cout<<setw(3)<<coin[i].a<<setw(3)<<coin[i].b<<setw(4)<<coin[i].c<<' ';   
  44.       j++;      
  45.       if(j%7==0)  
  46.       cout<<endl;  
  47.       if(j%21==0)  
  48.        cout<<endl;//分行显示  
  49.    }  
  50.    cout<<endl<<"共有"<<m<<"种换法"<<endl;  
  51.    cout<<"所需硬币最少的情况:"<<"1分"<<min.c<<"个"<<" 2分"<<min.b<<"个"<<" 5分"<<min.a<<"个共"<<min.num<<"个"<<endl;  
  52.   
  53. }  

        
  

  

这个问题可以用动态规划来决。在C++中,我们可以创建一个二维数组`dp[i][j]`,其中`i`代表总金额(从1100),`j`代表剩余的一元钞票数。`dp[i][j]`表示如果总金额是`i`,且有一张未使用的1钞票,那么有多少种组合可以将`i`兑换一分二分五分硬币。 初始状态,`dp[0][1] = 1`,因为恰好有一枚一元硬币可以直接兑换。然后遍历所有的金额和剩余钞票数,根据以下规则更新: 1. 如果当前不需要使用1钞票,那么只可能是用一分二分五分硬币,所以`dp[i][j] += dp[i - x][j + 1]`,其中`x`是当前考虑的硬币面值1, 2, 或者5)。 2. 如果需要使用1钞票,那么剩余金额`i - 100`可以由任意组合构,`dp[i][j] += dp[i - 100][j - 1]`。 最后,`dp[100][0]`就是所有可行的组合数。以下是简单的C++代码实现: ```cpp #include <vector> int coinChange(int coins[], int m, int n) { std::vector<std::vector<int>> dp(n + 1, std::vector<int>(m + 1, 0)); dp[0][1] = 1; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (coins[j] <= i) { dp[i][j] += dp[i - coins[j]][j + 1]; } dp[i][j] += dp[i][j - 1]; // 使用1钞票的情况 } } return dp[n][m]; } // coins[] 存储的是硬币面值(如 {1, 2, 5}) int main() { int coins[] = {1, 2, 5}; int m = sizeof(coins) / sizeof(coins[0]); int totalCoins = 100; // 总金额 int result = coinChange(coins, m, totalCoins); if (result > 0) std::cout << "有 " << result << " 种换法。\n"; else std::cout << "无法找到决方案。\n"; return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值