• 等边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; 
    }
  • 相关阅读:
    VS Code 的常用快捷键
    oj教程--坑
    oj教程--学习顺序
    oj教程--链表
    oj教程--队列
    oj教程--栈
    【MySQL】汇总数据
    【MySQL】使用WHERE子句
    【MySQL】SELECT语句
    【MySQL】使用MySQL(连接、选择数据库、显示数据库和表信息)
  • 原文地址:https://www.cnblogs.com/xusi/p/12344915.html
Copyright © 2020-2023  润新知