프로그래머 상호작용 연맹 코딩 대회 첫 번째 문제

2660 단어 부호화
1에서 N까지의 연속 정수로 구성된 집합을 두 개의 서브 집합으로 나누고 각 집합의 숫자와 같음을 보증한다.예를 들어 N=3에 대응하는 집합 {1,2,3}은 {3}과 {1,2} 두 개의 서브집합으로 나눌 수 있다.이 두 자 집합 중의 원소는 각각 과 같다.N=3에 대해 우리는 단지 하나의 구분 방법만 있을 뿐, N=7에 대해서는 4가지 구분 방안이 있을 것이다.입력은 N의 값(1≤ N ≤ 39)을 나타내는 정수로 한 줄을 포함합니다.출력은 한 줄을 포함하고, 단지 하나의 정수만 포함하며, 샤오맹은 N에 대응하는 집합의 방안의 개수를 구분할 수 있다.구분이 없을 때 0을 출력합니다.
입력: 7 출력: 4 프로그래머 상호작용 연맹은 위챗 신호로 괜찮고 제목도 어렵지 않다.분석: 이 문제는 폭력적으로 해결된 것이 분명하지만 이전에 문제를 잘못 봤어. 한참을 고민했는데 어이가 없어!사고방식도 간단하다. 바로 무작위로 평화를 구하는 것이다. 중복되지 않도록 순서대로 검색하면 된다!
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,as=0;
int mark[300];
void dfs(int ans,int sm,int k)//sum   ,sm        k        
{
    if(sm>ans)
    return;
    if(ans==sm) 
    {
        as++;
        return ;
    }
    for(int i=k+1;i<=n;i++)
    {
        if(!mark[i])
        {
        mark[i]=i;
        dfs(ans,sm+i,i);
        mark[i]=0;
        }
    }
}

int main()
{
    memset(mark,0,sizeof(mark));
    while(cin>>n)
    {
        int sum=(1+n)*n/2;//n    
        sum/=2;
    dfs(sum,0,0);
    cout<<as/2<<endl;//    ,         
    }
    return 0;
 } 

좋은 웹페이지 즐겨찾기