组合题5 个小题
已作答 0 / 5
- (匠人的自我修养)
一个匠人决定要学习 n 个新技术。要想成功学习一个新技术,他不仅要拥有一定的经验值,而且还必须要先学会若干个相关的技术。学会一个新技术之后,他的经验值会增加一个对应的值。给定每个技术的学习条件和习得后获得的经验值,给定他已有的经验值,请问他最多能学会多少个新技术。
输入第一行有两个数,分别为新技术个数 n(l≤n≤103),以及己有经验值(≤107)。
接下来 n 行。第 i 行的两个正整数,分别表示学习第 i 个技术所需的最低经验值(≤107),以及学会第 i 个技术后可获得的经验值(≤107)。
接下来 n 行。第 i 行的第一个数 mi(0≤mi<n),表示第 i 个技术的相关技术数量。紧跟着 m 个两两不同的数,表示第 i 个技术的相关技术编号。
输出最多能学会的新技术个数。
下面的程序以 O(n2) 的时间复杂度完成这个问题,试补全程序。
1#include<cstdio>2using namespace std;3const int maxn = 1001;4 5int n;6int cnt[maxn];7int child [maxn][maxn];8int unlock[maxn];9int threshold[maxn], bonus[maxn];10int points;11bool find(){12 int target = -1;13 for (int i = 1; i <= n; ++i)14 if(① && ②){15 target = i;16 break;17 }18 if(target == -1)19 return false;20 unlock[target] = -1;21 ③22 for (int i = 0; i < cnt[target]; ++i)23 ④24 return true;25}26 27int main(){28 scanf("%d%d", &n, &points);29 for (int i = 1; i <= n; ++i){30 cnt[i] = 0;31 scanf("%d%d", &threshold[i], &bonus[i]);32 }33 for (int i = 1; i <= n; ++i){34 int m;35 scanf("%d", &m);36 ⑤37 for (int j = 0; j < m; ++j){38 int fa;39 scanf("%d", &fa);40 child[fa][cnt[fa]] = i;41 ++cnt[fa];42 }43 }44 45 int ans = 0;46 while(find())47 ++ans;48 49 printf("%d\n", ans);50 return 0;51}⑤处应填()