划分为k个相等的子集

题目描述

给定一个包含n个整数的数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

输入

输入包括共2行
第1行:整数数组元素个数 n和非空子集个数K
第2行:n个整数

输出

若能划分为k个相等的子集则输出 Yes
否则输出 No

样例输入

复制样例数据

7 4
4 3 2 3 5 2 1

样例输出

Yes

提示

说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。
100%的数据满足:0<n<15,  0<K<10,  0<nums[i]<1000

来源/分类

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,s,a[20];
bool vis[20];
bool dfs(int x,int c,int k){
    if(k==1) return true;
    if(x==s) return dfs(0,0,k-1);
    int i;
    for(i=c;i<n;i++){
        if(vis[i]==true) continue;
        vis[i]=true;
        if(dfs(x+a[i],c+1,k)) return true;
        vis[i]=false;
    }
    return false;
}
int main()
{
    int k;
    cin>>n>>k;
    int i;
    long long sum=0;
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    if(sum%k!=0) printf("No
");
    else {
        s=sum/k;
        bool y=dfs(0,0,k);
        if(y==true) printf("Yes
");
        else printf("No
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/skyleafcoder/p/12319516.html