首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-08-21 
UVa11218 - KTV,Rujia Liu的神题(一)链接:http://uva.onlinejudge.org/index.php?optioncom_onlinejudge&

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

链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=112&page=show_problem&problem=2159


类型:   暴力回溯


原题:

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.

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

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?

InputThe 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.

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

Sample Input
31 2 3 14 5 6 27 8 9 341 2 3 11 4 5 21 6 7 31 8 9 40

Output for the Sample Input
Case 1: 6Case 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;}

——  生命的意义,在于赋予它意义。

               原创 http://blog.csdn.net/shuangde800 , By   D_Double  (转载请标明)




热点排行