货币面值1
题目描述
小猴有 n 种面值不同的钱币 wi ,每种面值的钱币 5 个。
小猴想知道用手中的钱币,恰好凑出 k 的方法有多少种?
【输入格式】
输入共 2 行:
第 1 行,2 个正整数 n,k;
第 2 行,n 个正整数 w1,w2,…,wn。
【输出格式】
输出共 1 行:
第 1 行,输出恰好凑出 k 的方案数。
#include <iostream>
using namespace std;
int n, m, cnt = 0, a[105], w[105], p[105];
void dfs(int step)
{
if(step > n)
{
int t = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] >= 1)
{
for (int j = 1; j <= a[i]; j++)
{
t += w[i];
}
}
}
if (t == m)
{
cnt++;
}
return;
}
for (int i = 0; i <= 5; i++)
{
a[step] = i;
dfs(step + 1);
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
dfs(1);
cout << cnt << endl;
return 0;
}
货币面值2
题目描述
小猴有 n 种面值不同的钱币 wi,每种面值的钱币 m 个。
小猴想知道用手中的钱币,恰好凑出 k 的方法有多少种?
【输入格式】
输入共 2 行:
第 1 行,3 个正整数 n,m,k;
第 2 行,n 个正整数 w1,w2,…,wn。
【输出格式】
输出共 1 行:
第 1 行,输出恰好凑出 k 的方案数。
#include <iostream>
using namespace std;
int n, m, k, cnt = 0, a[105], w[105], p[105];
void dfs(int step)
{
if(step > n)
{
int t = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] >= 1)
{
for (int j = 1; j <= a[i]; j++)
{
t += w[i];
}
}
}
if (t == k)
{
cnt++;
}
return;
}
for (int i = 0; i <= m; i++)
{
a[step] = i;
dfs(step + 1);
}
}
int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
dfs(1);
cout << cnt << endl;
return 0;
}
货币面值3
题目描述
小猴有 n 种面值不同的钱币 wi,具体地说,小猴有面值 1w1 的钱币 1c1 个,面值 2w2 的钱币 2c2 个,..,面值 wn 的钱币 cn 个。
小猴想知道用手中的钱币,恰好凑出 k 的方法有多少种?
【输入格式】
输入共 3 行:
第 1 行,2 个正整数 n,k;
第 2 行,n 个空格隔开的正整数 wi 表示面值;
第 3 行,n 个空格隔开的正整数 ci 表示个数。
【输出格式】
输出共 1 行:
第 1 行,输出恰好凑出 k 的方案数
#include <iostream>
using namespace std;
int n, k, cnt = 0, a[105], w[105], p[105], c[105];
void dfs(int step)
{
if(step > n)
{
int t = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] >= 1)
{
for (int j = 1; j <= a[i]; j++)
{
t += w[i];
}
}
}
if (t == k)
{
cnt++;
}
return;
}
for (int i = 0; i <= c[step]; i++)
{
a[step] = i;
dfs(step + 1);
}
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
for (int i = 1; i <= n; i++)
{
cin >> c[i];
}
dfs(1);
cout << cnt << endl;
return 0;
}