问题背景】
近日,班里在谣传,据说这次数学考试只有N道题目,满分为150分……
【问题描述】
浪子经过周密的计算,终于确定了一个良好的座位(至少那个座位没有什么人能看到你在作弊~_~|)不过考场的玻璃是特殊研制的——无线电无法穿透,因此,第一种方法就失去了效用。
浪子最终决定,利用高超的COMPUTER技术得到了本次试卷的内容——不看还好,一看就不得了——也忒难了点吧……
不过浪子只会做里面的M道题目,只好向附近的T个朋友请教。谁知道他们竟然开高价格(T_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道题目做完的方案。
输出格式: 一个数,浪子最少要准备多少辛苦费。
输入文件: exam.in
输出文件: exam.out
样例输入:
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>
using namespace std;
int n,k,x[35],ans=1000000;
int m;
struct node{
int p;
int n;
int a[50];
}f[105];
bool w[55],q[55];
bool fa=true;
void dfs(int cnt,int sum,int t){
for(int i=1;i<=m;i++){
if(!w[i] && !q[i]){
fa=false;
break;
}
}
if(fa){
ans=min(ans,sum);
return ;
}
else{
for(int i=t;i<=n;i++){
for(int j=1;j<=f[i].n;j++)w[f[i].a[j]]=true;
dfs(cnt+1,sum+f[i].p,i+1);
for(int j=1;j<=f[i].n;j++)w[f[i].a[j]]=false;
}fa=true;
}
return;
}
int main(){
cin>>m>>n>>k;
for(int i=1;i<=n;i++){
cin>>x[i];
q[x[i]]=true;
}
for(int i=1;i<=k;i++){
cin>>f[i].p>>f[i].n;
for(int j=1;j<=f[i].n;j++){
cin>>f[i].a[j];
}
}
dfs(0,0,1);
cout<<ans;
return 0;
}