記事ディレクトリ
1.タイトル
コインには、50セント、25セント、10セント、5セント、1セントの5種類があるとします。私たちはこれらのコインを一定の金額で変更したいと考えています。
たとえば、11セントの場合、10セントコイン1枚と1セントコイン1枚、または5セントコイン2枚と1セントコイン1枚、または5セントコイン1枚と1セントコイン6枚で変更できます。セント硬貨、または11セント硬貨。したがって、上記のコインで11セントの変更を行うには4つの方法があります。ゼロセントで変更を行う方法は1つあると考えています。
セントで金額を変更するさまざまな方法の総数を見つけるプログラムを作成します。プログラムは最大100コインを処理できる必要があります。
入力
入力ファイルには任意の数の行が含まれており、各行には金額(セント)の数(≤250)で構成されています。
出力
各入力行について、上記の5種類のコインで変更を行うさまざまな方法を含む行を出力します。
入力例
11
26
Sample Output
4
13
2.質問
5種類のコインを与える:1,5,10,25,50、nを与える、これらのコインを使用してnの値を形成するメソッドの数を見つけます。
3.問題解決のアイデア
完全なナップザック問題、状態転送方程式dp [k] [v] = dp [k] [v] + dp [k-1] [v-a [i]]、ここでdp [k] [v]はkを意味しますコインはvの値を持つメソッドで構成され、a [i]はコインiの値を表します。
バックパック9:ここをクリックしてください。
4.コード
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[5] = { 1,5,10,25,50 }; ///表示5种硬币各自的价值
int dp[110][260];///表示dp[i][v] 用i个硬币凑成价值为v的方法数
int main()
{
int n;
while (cin >> n)
{
memset(dp, 0, sizeof(dp)); //初始化dp数组
dp[0][0] = 1;///边界
for (int i = 0; i < 5; i++)
{
for (int k = 1; k <= 100; k++) //k个硬币
{
for (int v = a[i]; v <= n; v++)
{
dp[k][v] += dp[k - 1][v - a[i]];//状态转移方程
}
}
}
int ans = 0;
for (int i = 0; i <= 100; i++)
{
ans += dp[i][n];
}
cout << ans << endl;
}
return 0;
}
参照ブログのリンク:
ここをクリック。