数据结构与算法实验题 K 歌

★实验任务

3* n 个人(标号1~ 3 * n )分成 n 组 K 歌。有 m 个 3 人组合,每个组合都对应一个分数,你能算出最大能够得到的总分数么?

★数据输入

输入的第 1 行是一个正整数 n 和 m(1<= n <=6 ,  n<=m<= C(3*n,3) 组合数) ,输入的第2~m+1行每行包括四个正整数a,b,c,s(1<=a , b ,c <=3 *n, a,b,c不相等,1<=s<=10 ^8)表示组合(a,b,c)可以获得分数 s。

★数据输出

输出可以获得的最大分数。(题目保证有一组解。)

输入示例

3 3

1 2 3 1

4 5 6 2

7 8 9 3

★输出示例

6

给出另外一组数据

3 5

1 2 3 2

4 5 6 5

1 4 5 3

2 3 6 7

7 8 9 1

输出

11

DFS+剪枝

用DFS进行遍历,然后如果不进行剪枝的话,当C(18,3)=816 种情况全部出来时,时间复杂度将高达 816^6。

那么如何进行剪枝?

取其中所有S中的最大值,最好情况下是DFS中该叶节点之后的所有都取到这个最大值,如果这个最好的情况都小于等于答案,那么此路显然不可能是最优解。

详见代码吧。。。。

#include<cstdio>
const int MAXN=1024;
int n,m;
bool exist[19]={0};
int ans=0;
int maxs=0;
struct combination
{
int a,b,c;
int s; }data[MAXN]; inline void setExist(bool a,int i)
{
exist[data[i].a]=exist[data[i].b] =exist[data[i].c]=a;
} void dfs(int cur,int now_c,int sum)
{
if(((n-now_c)*maxs+sum)<=ans) //剪枝
return; if(now_c==n)
{
if(ans<sum)
ans=sum; return;
}
int i;
for(i=cur;i<m;i++)
{
if( exist[data[i].a] ==false && exist[data[i].b] ==false &&exist[data[i].c]==false)
{
setExist(1,i); dfs(i+1,now_c+1,sum+data[i].s); setExist(0,i);
}
}
} int main()
{
scanf("%d%d",&n,&m);
int i;
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&data[i].a,&data[i].b,&data[i].c,&data[i].s);
if(maxs< data[i].s)
maxs=data[i].s;
} dfs(0,0,0);
printf("%d\n",ans);
}

数据结构与算法实验题 9.1 K 歌 DFS+剪枝的更多相关文章

  1. 数据结构与算法实验题 6.1 s_sin’s bonus

    数据结构与算法实验题 6.1 s_sin's bonus ★实验任务 正如你所知道的 s_sin 是一个非常贪玩的人 QAQ(如果你非常讨厌他请直接从第二段开 始看),并且令人感到非常遗憾的是,他是一 ...

  2. 数据结构与算法实验题 4.2 Who is the strongest

    数据结构与算法实验题 4.2 Who is the strongest ★实验任务 在神奇的魔法世界,召唤师召唤了一群的魁偶.这些魁偶排成一排,每个魁偶都有一个 战斗值.现在该召唤师有一个技能,该技能 ...

  3. HDU 3791 二叉搜索树 (数据结构与算法实验题 10.2 小明) BST

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3791 中文题不说题意. 建立完二叉搜索树后进行前序遍历或者后序遍历判断是否一样就可以了. 跟这次的作业第 ...

  4. 数据结构与算法实验题6.1 s_sin’s bonus byFZuer

    玩家从n 个点n-1 条边的图,从节点1 丢下一个小球,小球将由于重力作用向下落,而从小球所在点延伸出的每一条边有一个值pi 为小球通过该条边的概率(注意从同一个节点向下延伸的所有边的pi 的和可以小 ...

  5. 数据结构与算法实验题7.1 M 商人的求救

    问题描述:A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去.M 先生说:“为了安全起见,我们的路线最多只能包 ...

  6. 数据结构与算法实验题 7.1 M 商人的求救

    问题描述: A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去.M 先生说:"为了安全起见,我们的路 ...

  7. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  8. 大公司面试经典数据结构与算法题C#/Java解答

    几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表 ...

  9. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

随机推荐

  1. 设置https验证方式

    if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))

  2. Codefroces Educational Round 26 837 C. Two Seals

    C. Two Seals time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. 小米开源文件管理器MiCodeFileExplorer-源码研究(7)-Favorite收藏管理和SQLite数据库CRUD

    FavoriteDatabaseHelper,存储favorite数据,到SQLite数据库.SQLiteOpenHelper是一个帮助管理数据库和版本的工具类.通过继承并重载方法,快速实现了我们自己 ...

  4. 洛谷——T1725 探险

    http://codevs.cn/problem/1725/ 时间限制: 1 s  空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解  查看运行结果   题目描述 Descri ...

  5. 4455: [Zjoi2016]小星星|状压DP|容斥原理

    OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #includ ...

  6. android关键组件service服务(一)

    一. Service简单介绍 Service是android 系统中的四大组件之中的一个(Activity.Service.BroadcastReceiver.ContentProvider),它跟A ...

  7. jquery的图片轮播 模板类型

    先说一下用到的几个重要的事件 j jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(event,childSelector,data,function,map) ...

  8. 72.挖掘CSDN密码到链表并统计密码出现次数生成密码库

    list.h #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include & ...

  9. golang 逐行读取文件

    package main import ( "bufio" "fmt" "io" "os" ) func main() ...

  10. DTU(用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备)

    DTU (Data Transfer unit),是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备.DTU广泛应用于气象.水文水利.地质等行业.