站外题求调(悬2关)
  • 板块学术版
  • 楼主nzy2011
  • 当前回复30
  • 已保存回复30
  • 发布时间2023/7/31 11:44
  • 上次更新2023/11/3 06:46:58
查看原帖
站外题求调(悬2关)
976347
nzy2011楼主2023/7/31 11:44

题目

选拔战士 Description 小J手下有N个战士(1<=N<=1000),每个战士都有若干种特异功能,这些功能从1开始编号,至多15种

如 果战士们所有的特异功能总类别数超过K的话,小J管不住他们了。

现在小J希望找出尽可能多的战士出来,但他们的特异功能不能超过K。

Format

Input 第一行输入N,D,K ,代表共有N个战士,特异功能共有D种,K的含义如上所述

下面N行,用于描述这N个战士的情况,格式如下: 先给出当前这个战士所有的特异功能,然后再给些它们的编号分别是多少.

Output

如题

Samples

输入数据 1

6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1

输出数据 1

5

本人代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,s=0,a[30],b[1000]={1},c[1000][30];
void f(int x,int sum1){
	if(sum1<=k) {
        int sum=0;
        for(int i=1;i<=n;i++) {
            for(int j=0;j<=m;j++){
                if(b[j]&&c[j][i]>=1) {
                    sum ++;
                    break;
                }
            }
        }
        s = max(s,sum);
    }
	if(sum1>k||x>m) return ;
    b[x] = 1;
    f(x+1,sum1+1);
    b[x] = 0;
    f(x+1,sum1);
}
signed main(){
    int p,q;
    cin>>n>>m>>k;
    s = 0;
	for(int j=1;j<=n;j++) {
        cin>>q;
        for(int i=1;i<=q;i++) {
            cin>>p;
            c[p][j] ++;
        }
        if(q==0) c[0][j] ++;
    }
	f(1,0);
	cout<<s<<endl;
	
    return 0;
}
2023/7/31 11:44
加载中...