第1题 考试
浪子决定,利用高超的COMPUTER技术得到了本次试卷的内容——不看还好,一看就不得了——也忒难了点吧……
不过浪子只会做里面的M道题目,只好向附近的T个朋友请教。谁知道他们竟然开高价格,不过幸运的是,他们会帮你解决掉Ki道题目。
输入格式
第1行,三个数 N,M,T(1≤M≤N≤30,1≤T≤10)。
接下来一行,M个数(1≤每个数≤N),表示浪子会做的题目的编号(可能有重复,未必按升序排列)。
接下来T行,每行第1个数是Pi(0≤Pi≤1000),表示收的辛苦费的价格;第2个数是Ki(1≤Ki≤min(N,10));再是Ki个数(1≤每个数≤N),表示第i位朋友会帮浪子做的题目的题号(可能有重复,未必按升序排列)。
注:输入数据不存在无解情况——就是无法把这N道题目做完的方案。
输出格式
一个数,浪子最少要准备多少辛苦费。
输入/输出例子1
输入:
10 5 3
1 3 5 7 9
10 4 1 2 3 4
20 4 5 6 7 8
100 10 6 7 8 9 10 1 2 3 4 5
输出:
100
样例解释
【样例说明】
去把第3个人喊来帮你做,只要付100块,还帮你全做了……
附上我的四十分代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[3000],a[3000],m,s[3000];
ll s1[3000],s2[35][1005],ans=1e18,n,t;
void work(ll k,ll x) {
if(k>t) {
ll s6=0;
for(int i=1;i<=n;i++) if(f[i]==0)s6=1;
if(x<ans&&s6==0)
ans=x;
return ;
}
for(int i=1;i<=s1[k];i++) f[s2[k][i]]=0;
for(int i=1;i<=m;i++) f[a[i]]=1;
work(k+1,x);
for(int i=1;i<=s1[k];i++) f[s2[k][i]]=1;
work(k+1,x+s[k]);
}
int main() {
cin>>n>>m>>t;
for(int i=1;i<=m;i++)
cin>>a[i],f[a[i]]=1;
for(int i=1;i<=t;i++) {
cin>>s[i]>>s1[i];
for(int j=1;j<=s1[i];j++)
cin>>s2[i][j];
}
work(1,0);
cout<<ans;
return 0;
}