等边n边型

蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边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; 
}
原文地址:https://www.cnblogs.com/xusi/p/12344915.html