HDOJ_ACM_Ahui Writes Word

Problem Description
We all know that English is very important, so Ahui strive for this in order to learn more English words. To know that word has its value and complexity of writing (the length of each word does not exceed 10 by only lowercase letters), Ahui wrote the complexity of the total is less than or equal to C.
Question: the maximum value Ahui can get.
Note: input words will not be the same.
 
Input
The first line of each test case are two integer N , C, representing the number of Ahui’s words and the total complexity of written words. (1 ≤ N ≤ 100000, 1 ≤ C ≤ 10000)
Each of the next N line are a string and two integer, representing the word, the value(Vi ) and the complexity(Ci ). (0 ≤ Vi , Ci ≤ 10)
 
Output
Output the maximum value in a single line for each test case.
 
Sample Input
5 20
go 5 8
think 3 7
big 7 4
read 2 6
write 3 5
 
Sample Output
15
Hint
Input data is huge,please use “scanf(“%s”,s)”
 
Code
Time limit exceeded
View Code
 1 #include <stdio.h>
 2 #define C 10000
 3 #define N 100000
 4 int f[C + 5];
 5 int value[N + 5];
 6 int complexity[N + 5];
 7 int main()
 8 {
 9     int i, j, n, c, count;
10     char str[15];
11     while (scanf("%d %d", &n, &c) != EOF)
12     {
13         for (i = 1; i <= n; i++)
14         {
15             scanf("%s", str);
16             scanf("%d %d", &value[i], &complexity[i]);
17         }
18         for (i = 1; i <= c; i++)
19             f[i] = 0;
20         for (i = 1, count = 1; i <= n; i++)
21         {
22             if (complexity[i] == 0)
23             {
24                 f[0] += value[i];
25             }
26             else
27             {
28                 complexity[count] = complexity[i];
29                 value[count] = value[i];
30                 count++;
31             }
32         }
33         for (i = 1; i <= count; i++)
34         {
35             for (j = c; j >= complexity[i]; j--)
36                 if (f[j] < f[j - complexity[i]] + value[i])
37                     f[j]  = f[j - complexity[i]] + value[i];
38         }
39         printf("%d\n", f[c]);
40     }
41     return 0;
42 }

Accepted

View Code
 
Key Points
This question is easy, if you just want get the answer. But the time will be exceeded, so you must improve the algrithm.
You will note that the vi and ci is really small, so you will find there are a lot of words whose value and complexity is the same.
So, you can translate it. using the array words[15][15] can receive all the arise number.
If you realize this, the follow question is the same to the before blog's question.
 
要点
咋看这个问题,很简单。 但是你会发现你的代码会超时,那么你需要改进算法,你会注意到vi和ci很小,所以有很多单词的value和complexity的值是相同的,所以你得到了转换的方法,用一个words[15][15]的数组就可以接收单词出现的次数。如果你已经想到这里了,那么接下来的问题就跟我上一篇博客的问题是一样的了。
 
Pay Attention
you must using while (scanf() != EOF)
you should write down on the paper firstly, then code on the comput.
it may spend 1000MS to circulate 200,000,000 times.
原文地址:https://www.cnblogs.com/chuanlong/p/2804080.html