🎆🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎆
今天我要开启一个新计划----【C++天梯计划】
目的是通过天梯计划,通过题目和知识点串联的方式,完成C++复习与巩固。
什么是穷举?
穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。
穷举程序框架
int sum=0; //解的个数初值为0
for(int i=区间下限;i<=区间上限;i++) //根据指定范围实施穷举
if (约束条件) //根据约束条件实施筛选
{
cout<<满足要求的解; //输出满足要求的解
sum++; //统计解的个数
}
例题1:
题目描述
数学中经典的“鸡兔同笼”问题,已知头共x个,脚共y只,问笼中的鸡和兔各有多少只?
输入
头和脚的数量。
输出
鸡和兔各自数量。一个空格隔开。
输入样例
30 90
输出样例
15 15
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;//定义变量j,t分别代表鸡的只数和兔子的只数
for(int j=1;j<=49;j++)
{
//兔子+鸡=50
t =50-j;
//当腿的数量=160,总只数=50,就输出j,t
if((2*j+4*t)==160)
cout<<j<<" "<<t<<endl;
}
return 0;
}
例题2:
题目描述
已知 nn 个整数 x_1,x_2,\cdots,x_nx 1 ,x 2 ,⋯,x n ,以及 11 个整数 kk(k<nk<n)。从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的和。例如当 n=4n=4,k=3k=3,44 个整数分别为 3,7,12,193,7,12,19 时,可得全部的组合与它们的和为:
3+7+12=223+7+12=22
3+7+19=293+7+19=29
7+12+19=387+12+19=38
3+12+19=343+12+19=34
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=293+7+19=29。输入格式
第一行两个空格隔开的整数 n,kn,k(1 \le n \le 201≤n≤20,k<nk<n)。
第二行 nn 个整数,分别为 x_1,x_2,\cdots,x_nx 1 ,x 2 ,⋯,x n (1 \le x_i \le 5\times 10^61≤x i≤5×10 6 )。输出格式
输出一个整数,表示种类数。
输入输出样例
输入 #1
4 3
3 7 12 19
输出 #1
1代码:
#include <cstdio>
#include<cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
long long int a[30],b[30],n,m,we=0,v=0,g[30],w7,g1=1;
bool sushu(int x)
{
int i,t=1;
if(x==1){return false;}
else if(x==2||x==3){return true;}
for(i=2;i*i<=x;i++)
{
if(x%i==0)
{t=0;
break;
}
}
if(t){return true;}
else{return false;}
}
void dfs(int x,int y)
{if(y==0)
{
if(sushu(v))
{we++;}
return ;
}
else
{
for(int w1=0;w1<x;w1++)
{
if(b[w1]==0)
{
b[w1]=1;
v+=a[w1];
dfs(x,y-1);
b[w1]=0;
v-=a[w1];
}
}
}
}
int main()
{
for(w7=1;w7<21;w7++)
{g1*=w7;
g[w7]=g1;
}
scanf("%lld %lld",&n,&m);
for(int w0=0;w0<n;w0++){scanf("%d",&a[w0]);}
dfs(n,m);
printf("%lld",we/g[m]);
return 0;
}