UVa 11218 - KTV, Rujia Liu的神题(一)

本文探讨了如何解决9人在KTV分组唱歌的问题,确保每组3人且每个人只参与一次,通过暴力回溯算法找出最佳组合以获得最高得分。

类型:   暴力回溯


原题:

One song is extremely popular recently, so you and your friends decided to sing it in KTV. The song has 3 characters, so exactly 3 people should sing together each time (yes, there are 3 microphones in the room). There are exactly 9 people, so you decided that each person sings exactly once. In other words, all the people are divided into 3 disjoint groups, so that every person is in exactly one group.

However, some people don't want to sing with some other people, and some combinations perform worse than others combinations. Given a score for every possible combination of 3 people, what is the largest possible score for all the 3 groups?

Input

The input consists of at most 1000 test cases. Each case begins with a line containing a single integer  n  (0 <  n  < 81), the number of possible combinations. The next  n  lines each contains 4 positive integers  a b c s  (1 <=  a  <  b  <  c  <= 9, 0 <  s  < 10000), that means a score of  s  is given to the combination ( a , b , c ). The last case is followed by a single zero, which should not be processed.

Output

For each test case, print the case number and the largest score. If it is impossible, print -1.

Sample Input

3
1 2 3 1
4 5 6 2
7 8 9 3
4
1 2 3 1
1 4 5 2
1 6 7 3
1 8 9 4
0

Output for the Sample Input

Case 1: 6
Case 2: -1


题目大意:

有9个人去KTV唱歌, 然后要分组一起唱歌,每组3人,一人只能分在一个组里。  然而不同的组合效果不同, 而且某些人不想跟某些人同一组。 所以不同的组合的得分是不同的。求出这些组合中最高能得到的总分是多少。


分析与总结:

这题是Rujia Liu's Problems for Beginners专题的第一题, 也是里面最简单的一题。

只需要暴力的回溯枚举出符合条件的情况,取其中最高的分数及可。

/*
 *  UVa  11218 - KTV
 *   回溯
 *  Time: 0.312s (UVa)
 *  Author: D_Double
 */
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int group[82][4], ans, n;
bool vis[82], occur[10];

void search(int cur,int tot){
    if(cur >= 3){
        if(tot > ans) ans = tot;
        return;
    }
    for(int i=0; i<n; ++i)if(!vis[i]){
        if(occur[group[i][0]] || occur[group[i][1]] || occur[group[i][2]])
            continue;
        occur[group[i][0]] = occur[group[i][1]] = occur[group[i][2]] = true;
        vis[i] = true;
        search(cur+1, tot+group[i][3]);
        occur[group[i][0]] = occur[group[i][1]] = occur[group[i][2]] = false;
        vis[i] = false;
    } 
}

int main(){
    int cas=1;
    while(scanf("%d", &n), n){
        for(int i=0; i<n; ++i)
            scanf("%d%d%d%d",&group[i][0],&group[i][1],&group[i][2],&group[i][3]);
        ans = -1;
        memset(vis, 0, sizeof(vis));
        memset(occur, 0, sizeof(occur));
        search(0, 0);
        printf("Case %d: %d\n", cas++, ans);
    }
    return 0;
}



【SCI区复现】基于配电网韧性提升的应急移动电源预配置和动态调度()—MPS动态调度(Matlab代码实现)内容概要:本文档围绕“基于配电网韧性提升的应急移动电源预配置和动态调度”主,重点介绍MPS(Mobile Power Sources)动态调度的Matlab代码实现,是SCI区论文复现的技术资料。内容涵盖在灾害或故障等极端场景下,如何通过优化算法对应急移动电源进行科学调度,以提升配电网在突发事件中的恢复能力与供电可靠性。文档强调采用先进的智能优化算法进行建模求解,并结合IEEE标准测试系统(如IEEE33节点)进行仿真验证,具有较强的学术前沿性和工程应用价值。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事电力系统优化、配电网韧性、应急电源调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于复现高水平期刊(SCI区、IEEE顶刊)中关于配电网韧性与移动电源调度的研究成果;②支撑科研项目中的模型构建与算法开发,提升配电网在故障后的快速恢复能力;③为电力系统应急调度策略提供仿真工具与技术参考。; 阅读建议:建议结合前篇“MPS预配置”内容系统学习,重点关注动态调度模型的数学建模、目标函数设计与Matlab代码实现细节,建议配合YALMIP等优化工具包进行仿真实验,并参考文中提供的网盘资源获取完整代码与数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值