站外题目求助
  • 板块学术版
  • 楼主Ink_sans2012
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/10 20:09
  • 上次更新2024/3/10 22:19:04
查看原帖
站外题目求助
1058052
Ink_sans2012楼主2024/3/10 20:09

问题背景】

近日,班里在谣传,据说这次数学考试只有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;
}


2024/3/10 20:09
加载中...