题目大意:我们的朋友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 "); 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 ", m-p); 54 } 55 return 0; 56 }
开始是把数据保存在garment[0...c-1]中,后来改为garment[1...c],却忘了在计算lowest时进行修改,WA了一次,以后记得修改完东西后检查一下是否对其他地方有影响,不要简单地依靠样例给的测试数据。