酒煮青梅392 2023-10-20 18:05 采纳率: 66%
浏览 78
已结题

c语言递归求硬币面值组合

img


#include <stdio.h>
/**********   Begin   **********/

//可以在此增加其他内容
void Cal2(int n,int i,int j,int k)
{
    int i1=i,j1=j,k1=k;
    if(n==0)
    {
        printf("%d %d %d \n",i1,j1,k1);
    }
    else if(n>=i1+j1*2+k1*5)
    {
        
            if(i1<=n)
            Cal2(n-i1-2*j1-5*k1,i1+1,j1,k1);
        
            if(i1+j1*2<=n)
            Cal2(n-i1-2*j1-5*k1,i1,j1+1,k1);
        
            if(i1+j1*2+k1*5<=n)
            Cal2(n-i1-2*j1-5*k1,i1,j,k1+1);
        
    
    }

}



void Cal(int n)
{
    //在此补充代码完成Cal函数功能
    int a = n;
    Cal2(a,0,0,0);
    
}

int main()
{
    int q;
    scanf("%d",&q);
    Cal(q);
}

/**********   End   **********/

img


这个代码输出有问题,不知道是哪里逻辑错了

  • 写回答

2条回答 默认 最新

  • 想要AC的dly 2023-10-20 18:40
    关注
    #include <stdio.h>
    void Cal2(int n,int i,int j,int k)//n表示当前剩余n价值的钱等待分配,ijk分别表示1、2、5角钱个数
    {
        int i1=i,j1=j,k1=k;
        if(n==0)                //不需要继续分配了直接输出方案
        {
            printf("%d %d %d \n",i1,j1,k1);
            return;
        }
        else if(n>0)            //还需要继续分配
        {
            Cal2(n-1,i1+1,j1,k1);       //优先考虑1角个数多的
            Cal2(n-2,i1,j1+1,k1);       //然后考虑2角个数多的
            Cal2(n-5,i1,j1,k1+1);          //最后考虑5角
        }
        else return;
    }
    
    void Cal(int n)         //不知道有啥用,没改
    {
        //在此补充代码完成Cal函数功能
        int a = n;
        Cal2(a,0,0,0);
    }
    
    int main()
    {
        int q;
        scanf("%d",&q);
        Cal(q);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月27日
  • 已采纳回答 10月20日
  • 创建了问题 10月20日