寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #DPL-DPL_1_A Coin Changing Problem

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題「コイン問題」
https://onlinejudge.u-aizu.ac.jp/problems/DPL_1_A
 額面がc1, c2,..., cm 円の m 種類のコインを使って、 n 円を支払うときの、コインの最小の枚数を求めて下さい。
 各額面のコインは何度でも使用することができます。

・入力される値
 1行目に整数 n と整数 m が1つの空白区切りで1行に与えられます。
 2行目に各コインの額面が1つの空白区切りで1行に与えられます。

・期待する出力
 コインの最小枚数を1行に出力してください。

・制約
 1 ≤ n ≤ 50,000
 1 ≤ m ≤ 20
 1 ≤ 額面 ≤ 10,000
 額面はすべて異なり、必ず1を含む。

僕が作成、提出したコードは、以下のとおりです。

/*
 DPL-DPL_1_A Coin Changing Problem
 http://judge.u-aizu.ac.jp/
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int n,m,min,val;
    cin>>n>>m;
    int min2[n],c[m];
    for(int i=0;i<m;i++){
        cin>>c[i];
    }
    min2[0]=0;
    min2[1]=1;
    for(int i=2;i<=n;i++){
        min=n+1;
        for(int j=0;j<m;j++){
            if(c[j]<=i){
                val=min2[i-c[j]]+1;
                min=((min<=val)?min:val);
            }
        }
        min2[i]=min;
    }
    cout<<min2[n]<<endl;
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
DPL-DPL_1_A Coin Changing Problem