题解
2025-03-20 22:18:05
发布于:广东
4阅读
0回复
0点赞
代码:
#include<bits/stdc++.h>
const double M=1e-9;
bool is(double a,double b){
return std::fabs(a-b)<M;
}
std::set<double> cr(const std::vector<double>& num) {
std::set<double> res;
if(num.size()==1){
res.insert(num[0]);
return res;
}
int n=num.size();
for(int i=1;i<n;++i){
std::vector<double> ln(num.begin(),num.begin()+i);
std::vector<double> rn(num.begin()+i,num.end());
std::set<double> lr=cr(ln);
std::set<double> rr=cr(rn);
for(double l:lr){
for(double r:rr){
res.insert(l+r);
res.insert(l-r);
res.insert(l*r);
if(!is(r,0)) res.insert(l/r);
}
}
}
return res;
}
bool j(const std::vector<double>& num,int x,double ans){
int n=num.size();
std::vector<int> comb(n);
for(int i=0;i<x;++i) comb[i]=1;
do{
std::vector<double> cc;
for(int i=0;i<n;++i) if(comb[i]) cc.push_back(num[i]);
std::set<double> res=cr(cc);
for(double i:res) if(is(i,ans)) return true;
}
while(std::prev_permutation(comb.begin(),comb.end()));
return false;
}
int main(){
int n,x;
double ans;
std::cin>>n>>x>>ans;
std::vector<double> num(n);
for(int i=0;i<n;++i) std::cin>>num[i];
(j(num,x,ans))?std::cout<<"yes":std::cout<<"no";
return 0;
}
代码思路:此代码主要通过递归和枚举的方法来解决问题。先枚举从 n 张卡牌中选取 x 张的所有组合,对于每一种组合,使用递归的方式生成所有可能的运算结果,最后检查这些结果中是否有等于目标值 ans 的。
时间复杂度:
这里空空如也
有帮助,赞一个