蒜头君去书店买书,他有 mm 元钱,书店里面有 nn 本书,每本书的价格为 p_ipi 元。蒜头君很爱学习,想把身上钱都用来买书,并且刚好买 kk 本书。请帮蒜头君计算他是否能刚好用 mm 元买 kk本书。
输入格式
第一行输入 33 个整数 m(1 \le m \le 100000000)m(1≤m≤100000000),n(1 \le n \le 30)n(1≤n≤30),k(1 \le k \le min(8, n))k(1≤k≤min(8,n))
接下来一行输入 nn 个整数,表示每本书的价格 p_i(1 \le p_i \le 100000000)pi(1≤pi≤100000000)。
输出格式
如果蒜头君能 刚好 用 mm 元买 kk 本书,输入一行"Yes", 否则输出"No"。
样例输入1
10 4 4 1 2 3 4
样例输出1
Yes
样例输入2
10 4 3 1 2 3 4
样例输出2
No
import java.util.Scanner;
public class Main {
static int m=0;//有m元钱
static int n=0;//书店里边有n本书
static int k=0;//刚好买k本书
static int[] p=new int[31];
static int[] flag=new int[31];
static int test=0;
//第一个参数表示你搜索到了第几本数
//第二个参数表示你选中了几本书
//第三个参数表示 买书花了多少钱
static void dfs(int tem,int kk,int s)
{
//选中的数目大于k 花的钱大于m return
if(test==1||s>m||kk>k)
return;
//如果选中的书的钱等于m 数目等于k return
if(k==kk)
{
if(s==m)test=1;
return;
}
for(int i=tem;i<p.length;i++)
{
if(flag[i]!=1)
{
flag[i]=1;
dfs(i+1,kk+1,s+p[i]);
flag[i]=0;
}
}
return;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
m=cin.nextInt();
n=cin.nextInt();
k=cin.nextInt();
for(int i=0;i<n;i++)
{
p[i]=cin.nextInt();// 每本书的价格
}
cin.close();
//第一个参数表示你搜索到了第几本数
//第二个参数表示你选中了几本书
//第三个参数表示 买书花了多少钱
dfs(0,0,0);
if(test==1)
{
System.out.print("Yes");
}
else {
System.out.println("No");
}
}
}
本文介绍了一个关于组合数学的问题,蒜头君试图用有限的资金购买特定数量的书籍。通过深度优先搜索算法来判断是否可以恰好用完资金购买指定数量的书籍。
1351

被折叠的 条评论
为什么被折叠?



