蒜头君去书店买书,他有 m 元钱,书店里面有 n 本书,每本书的价格为 p_i 元。蒜头君很爱学习,想把身上钱都用来买书,并且刚好买 k 本书。请帮蒜头君计算他是否能刚好用 m 元买 k 本书。
输入格式
第一行输入 3 个整数m(1≤m≤100000000),n(1≤n≤30),k(1≤k≤min(8,n))
接下来一行输入 n 个整数,表示每本书的价格pi(1≤pi≤100000000)。
输出格式
如果蒜头君能 刚好 用 m 元买 k本书,输入一行”Yes”, 否则输出”No”。
样例输入1
10 4 4
1 2 3 4
样例输出1
Yes
对于dfs我还不是很会写,看到解析就是把所有的情况按照树的形式分开,例如这个题,买和不买就是两种状态,那么这就是树的两个分支。写在代码里就是
dfs(num + 1, sum + prices[i], i + 1);
dfs(num, sum, i + 1);
#include <iostream>
#include <stack>
using namespace std;
int n, k, flag = 0;
long long m;
long long prices[31];
int marked[31] = {0};
void dfs(long long num, long long sum, int i){
if (num > k || sum > m || i > n + 1) {
return;
}
if (num == k && sum == m) {
flag = 1;
return;
}else{
dfs(num + 1, sum + prices[i], i + 1);
dfs(num, sum, i + 1);
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin >> m >> n >> k;
for (int i = 0; i < n; i++) {
cin >> prices[i];
}
dfs(0, 0, 0);
if (flag) {
cout << "Yes";
}else{
cout << "No";
}
return 0;
}