UVa 11450 - Wedding shopping

  题目大意:我们的朋友Bob要结婚了,所以要为他买一些衣服。有m的资金预算,要买c种类型的衣服(衬衫、裤子等),而每种类型的衣服有k个选择(只能做出一个选择),每个选择的衣服都有一个价格,问如何选择才能使花费控制在预算范围内并使得花费尽量大?输出最大花费。

  用dp进行解决,bool dp[i][j]用以表明在买完第i种类型的衣服后是否可能有j的资金剩余。递推至dp[c][],找出dp[c][]中最小的资金剩余。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct Garment
 7 {
 8     int size;
 9     int model[25];
10 } garment[25];
11 bool dp[25][210];
12 
13 int main()
14 {
15 #ifdef LOCAL
16     freopen("in", "r", stdin);
17 #endif
18     int T;
19     scanf("%d", &T);
20     while (T--)
21     {
22         int m, c;
23         scanf("%d%d", &m, &c);
24         for (int i = 1; i <= c; i++)
25         {
26             scanf("%d", &garment[i].size);
27             for (int j = 0; j < garment[i].size; j++)
28                 scanf("%d", &garment[i].model[j]);
29             sort(garment[i].model, garment[i].model+garment[i].size);
30         }
31         int lowest = 0;
32         for (int i = 1; i <= c; i++)
33             lowest += garment[i].model[0];
34         if (lowest > m)
35         {
36             printf("no solution\n");
37             continue;
38         }
39         memset(dp, 0, sizeof(dp));
40         dp[0][m] = 1;
41         for (int i = 1; i <= c; i++)
42         {
43             for (int j = 0; j <= m; j++)
44                 if (dp[i-1][j])
45                 {
46                     for (int p = 0; p < garment[i].size; p++)
47                         if (j - garment[i].model[p] >= 0)
48                             dp[i][j-garment[i].model[p]] = 1;
49                 }
50         }
51         int p = 0;
52         while (!dp[c][p])  p++;
53         printf("%d\n", m-p);
54     }
55     return 0;
56 }
View Code

  开始是把数据保存在garment[0...c-1]中,后来改为garment[1...c],却忘了在计算lowest时进行修改,WA了一次,以后记得修改完东西后检查一下是否对其他地方有影响,不要简单地依靠样例给的测试数据。

posted @ 2013-09-05 11:17  xiaobaibuhei  阅读(317)  评论(0编辑  收藏  举报