蒜头君买书

题目描述

蒜头君去书店买书,他有 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值