题目:
小明同学,在参加1场考试,考试时间是两个小时,试卷上一共有n道题目,小明要在规定的时间内完成一定数量的题目;
考试中不限制试题作答顺序,对于第i道题目,小明有三种不同的策略进行选择:
(1)直接跳过这道题目不花费时间,本题得0分;
(2)只做一部分题目,花费pi分钟的时间,本题可以得到ai分;
(3)做完整个题目花费qi分钟的时间,可以得到bi分;
小明想知道他最多能得到多少分?
输入:
第一行输入一个n数表示题目的数量
接下来n行 ,每行四个数表示pi,ai,qi,bi(1<=n<=100,1<=pi<=qi<=120,0<=ai<=bi<1000);
输出:
输出一个整数,小明的最高分。
样例输入:
4
20 20 100 60
50 30 80 55
100 50 110 88
5 3 10 6
样例输出:
94
思路:
稍微复杂点的背包问题;
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int TIME = 121; 4 int process(const vector<int>& p,const vector<int>& a, 5 const vector<int>& q,const vector<int>& b) { 6 int n = p.size(); 7 if (n == 0) return 0; 8 9 vector<vector<int> > memo(n,vector<int>(TIME+1,-1)); 10 for (int j = 0; j <= TIME; ++j) { 11 memo[0][j] = (j >= p[0] ? a[0]:0); 12 memo[0][j] = (j >= q[0] && b[0] > a[0] ? b[0]:memo[0][j]); 13 } 14 15 for (int i = 1; i < n; ++i) { 16 for (int j = 0; j <= TIME ; ++j) { 17 memo[i][j] = memo[i-1][j]; 18 if (j >= p[i]) 19 memo[i][j] = max(memo[i][j],a[i] + memo[i-1][j-p[i]]); 20 if (j >= q[i]) { 21 memo[i][j] = max(memo[i][j],b[i] + memo[i-1][j-q[i]]); 22 } 23 } 24 } 25 26 return memo[n-1][TIME]; 27 } 28 29 30 int main() 31 { 32 int n; 33 cin >> n; 34 int dp[TIME]; 35 memset(dp, 0, TIME * sizeof(int)); 36 int p, a, q, b; 37 38 vector<int> pVector; 39 vector<int> aVector; 40 vector<int> qVector; 41 vector<int> bVector; 42 43 for (int k = 0; k < n; ++k) { 44 cin >> p >> a >> q >> b; 45 pVector.push_back(p); 46 aVector.push_back(a); 47 qVector.push_back(q); 48 bVector.push_back(b); 49 } 50 cout << process(pVector,aVector,qVector,bVector); 51 }
-------64%解法-,留作参考---------------------------
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int TIME = 121; 5 6 int main() 7 { 8 int n; 9 cin >> n; 10 int dp[TIME]; 11 memset(dp, 0, TIME * sizeof(int)); 12 int p, a, q, b; 13 int i, j; 14 for (i = 0; i < n; i++) 15 { 16 cin >> p >> a >> q >> b; 17 for (j = 0; j + p < TIME; j++) 18 { 19 dp[j] = max(dp[j], dp[j + p] + a); 20 } 21 for (j = 0; j + q < TIME; j++) 22 { 23 dp[j] = max(dp[j], dp[j + q] + b); 24 } 25 } 26 int ret = 0; 27 for (i = 0; i < TIME; i++) 28 { 29 ret = max(ret, dp[i]); 30 } 31 cout << ret; 32 }