题目传送门:1146. 采药
思路:
典型的0-1背包问题,不像分数背包问题可以用贪心算法,所以只能用动态规划。dp[i][j]表示在限定时间j内,只从前i个山药里面取能得到的最大价值。dp的构建同样采用自底向上的方法。
对于第i个山药,考虑取与不取,有dp[i - 1][j]和dp[i - 1][j - t[i]] + v[i]两种情况,取较大值即可。
代码:
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 6 int main(){ 7 int t,m; 8 cin >> t >> m; 9 int times[m],values[m]; 10 for(int i = 0;i < m;i++) 11 cin >> times[i] >> values[i]; 12 int dp[m + 1][t + 1]; 13 for(int i = 0;i < t + 1;i++) 14 dp[0][i] = 0; 15 for(int i = 1;i < m + 1;i++){ 16 for(int j = 0;j < t + 1;j++){ 17 if(j >= times[i - 1]) 18 dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - times[i - 1]] + values[i - 1]); 19 else 20 dp[i][j] = dp[i - 1][j]; 21 } 22 } 23 cout << dp[m][t] << endl; 24 return 0; 25 }