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