Словесная игра
http://acm.pku.edu.cn/JudgeOnline/problem?id=1171

Словесные игры популярны дома и на телевидении. В нашем формате игры каждая буква имеет цену, и вы должны из букв составить одно или более слов, дающих максимальную суммарную стоимость. До тех пор, пока возможно, вы подбираете все известные вам слова, иногда проверяя правописание и вычисляя их стоимость. Очевидно, это лучше сделать с помощью компьютера.
Даны цены букв (рисунок выше), список английских слов и набор букв. Найдите в словаре слова или пары слов с наибольшей суммарной стоимостью, которые можно составить из заданного набора букв.
Входные данные
В первой строке находится перечисление допустимых маленьких английских букв. В последующих строках задается словарь - по одному слову в строке. Окончание ввода - символ "." (точка) в последней строке.
Выходные данные
В единственной строке вывести одно число - искомую наибольшую суммарную стоимость.
Пример входных данных
prmgroa
profile
program
prom
rag
ram
rom
.
Примечание
Рекомендуется использовать при использования языка С для считывания оператор scanf в связи с большими входными данными.
Пример выходных данных
24
Анализ условия и разбор идеи решения
Пример решения на С++:
#include <iostream>
#include <algorithm>
using namespace std;
void JooPoo()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
}
int Map[26]={2,5,4,4,1,6,5,5,1,7,6,3,5,2,3,5,7,2,1,2,4,6,6,7,5,7};
int score[40000],dict_use[26]={0},word_use[26],tmp_use[26];
char dict[8],word[40000][8];
int main()
{
JooPoo();
int i,j,k,n;
gets(dict);
for (i=0; dict[i]!='\0'; i++)
dict_use[dict[i]-'a']++;
n = 0;
while (gets(word[n]))
{
if (word[n][0] == '.') break;
bool isword=true;
score[n]=0;
memset(word_use, 0 ,sizeof(word_use));
for (i=0; word[n][i]!='\0'; i++)
{
if (dict_use[word[n][i]-'a'] == 0 || word_use[word[n][i]-'a'] >= dict_use[word[n][i]-'a'])
{
isword = false;
score[n] = 0;
break;
}
else
word_use[word[n][i]-'a']++;
score[n] += Map[word[n][i]-'a'];
}
if (isword == true)
n++;
}
int Max = *max_element(&score[0], &score[n]);
for (i=0; i<n; i++)
{
memcpy(word_use,dict_use,sizeof(dict_use));
for (j=0; word[i][j]!='\0'; j++)
word_use[word[i][j]-'a']--;
for (j=i+1; j<n; j++)
{
bool isOK = true;
memcpy(tmp_use,word_use,sizeof(word_use));
for (k=0; word[j][k]!='\0'; k++)
{
tmp_use[word[j][k]-'a']--;
if (tmp_use[word[j][k]-'a'] < 0)
{
isOK = false;
break;
}
}
if (isOK == true)
{
if (score[i] + score[j] > Max)
Max = score[i] + score[j];
}
}
}
printf("%d\n",Max);
}