b511

輸入說明 :

輸入有三行 第一行一個數字 N 代表有幾種不同面值的銅板 (N <= 5) 第二行就是 N 個整數,表示 N 種對應的銅板面值 第三行一個數字是要需要找零的金額

輸出說明 :

列出每一種找零方法,用括號框住每個銅板的數量,數量之間用逗號隔開,每一種找零方法後面要換行。不同的找零方法的排列順序要依照題目的規定。

這題是學長教我的

先定義一個結構,一組可能的答案,這個結構放每種硬幣的可能性

在來定義這個結構怎麼比大小(運算子多載)

接著用遞迴的方式來找答案

對於每一種硬幣最多取到它的數目加種 = 要求的數值

比方說1,5,10 去湊17

10最多一個 ,5最多三個 ,1最多17個

所以用while迴圈來控制每一輪要做幾個

最後排序a的vector即可

#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int N, cash;
int v[5];

struct amount
{
    int coins[5];
    int i;

    amount()
    {    
        for(i=0;i<N;i++)
            coins[i]=0;
    }    

    bool operator < (const amount &a) const
    {
        for(int j=0;j<N;j++) 
        {
            if( coins[j] < a.coins[j] ) return true;
            else if(coins[j] > a.coins[j]) return false;
        }
        return false;
    }
}; 

vector <amount> vnum;
void dfs(int remains,amount a,int cur)
{
    if(cur==N)
    {
        if(remains==0)
        {
            vnum.push_back(a);
        }    
        return ;
    }

    while(remains>=0)
    {
        dfs(remains,a,cur+1);

        remains -= v[cur];
        a.coins[cur]+=1; 
    }
    return ;
}
int main()
{
    scanf("%d",&N);
    int i,j;
    for(i=0;i<N;i++)
        scanf("%d",&v[i]);
    scanf("%d",&cash);

    amount temp;
    dfs(cash,temp,0);

    sort(vnum.begin(),vnum.end());

    for(i=0;i<vnum.size();i++)
    {
        printf("(");

        for(j=0;j<N-1;j++)
        {
            printf("%d,",vnum[i].coins[j]);
        }
        printf("%d",vnum[i].coins[N-1]);
        printf(")\n");    

    }
    return 0;
}