蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边n边型,并且每根木棍都要用到。 例如,蒜头君手上有长度为 1,2,3,3 的4根木棍,他可以让长度为1,2 的木棍组成一条边,另外 2 跟分别组成 2 条边,拼成一个边长为 3 的等边三角形。蒜头君希望你提前告诉他能不能拼出来,免得白费功夫。
输入格式
首先输入一个整数 n(3≤n≤20),m,表示木棍数量和构成边数,接下来输入 n 根木棍的长度pi (1≤pi≤10000)。
输出格式
如果蒜头君能拼出等边n边型,输出”yes”,否则输出”no”。
样例输入
4 3
1 2 3 3
样例输出
yes
样例输入
4 3
1 1 1 1
样例输出
no
样例输入
4 4
1 1 1 1
样例输出
yes
#include <stdio.h> #include <iostream> #include <math.h> #include <string.h> using namespace std; const double PI=acos(-1.0); const int inf=0x7fffffff; int a[105]; bool vis[105]; bool ok; int n,m,sum; void dfs(int pos,int cnt,int s){ if(cnt==m){ ok=1; return; } if(ok){ //如果找到解了就直接返回 return; } if(s==sum/m){ dfs(0,cnt+1,0);//如果某个边构成了就开始构下一个边 } for(int i=pos;i<n;i++){//从pos开始表示前面选过的不再重复 if(!vis[i]){ vis[i]=1; dfs(pos+1,cnt,s+a[i]); vis[i]=0; } } } int main(){ cin>>n>>m; for(int i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } if(sum%m!=0){//所以边和都不能整除m,就不能构成 cout<<"no"; } else{ dfs(0,0,0); if(ok){ cout<<"yes"; } else cout<<"no"; } return 0; }