题目描述
蒜头君去书店买书,他有 m 元钱,书店里面有 nn本书,每本书的价格为pi 元。蒜头君很爱学习,想把身上钱都用来买书,并且刚好买 k本书。请帮蒜头君计算他是否能刚好用 m元买 k本书。
输入格式
第一行输入 3个整数 m(1≤m≤100000000),n(1≤n≤30),k(1≤k≤min(8,n)) 接下来一行输入 n 个整数,表示每本书的价格p i (1≤p i ≤100000000)。
输出格式
如果蒜头君能 刚好 用 m 元买 k 本书,输入一行"Yes", 否则输出"No"。
样例输入1
10 4 4
1 2 3 4
样例输出1
Yes
样例输入2
10 4 3
1 2 3 4
样例输出2
No
AC代码
#include <iostream>
using namespace std;
int m,n,k;//总共的钱 书店的书 要买的书
int p[35];//每本书的价钱
int flag = 0;
void dfs(int x,int y,int z){//当前的钱 当前买了好多本 买的第几本书
if(x==m&&y==k){
flag=1;//满足要求
}
if(x>m||y>k||z>=n) return;//不满足条件的情况
dfs(x+p[z],y+1,z+1);//买这本书看看能不能满足要求,不满足就不买,flag不会变
dfs(x,y,z+1);//不买这本书看能不能满足要求
}
int main(){
cin>>m>>n>>k;
for(int i = 0;i<n;i++){
cin>>p[i];
}
dfs(0,0,0);
if(flag){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
return 0;
}