二、 解题思路:用动态规划的思路,阶段就是“物品的件数”,状态就是“背包剩下的容量”,那么很显然f[i,v] 就设为从前 i 件物品中选择放入容量为 v 的背包最大的价值。那么有两种情况:
第i个物品大于背包容量,那么无法放入,dp[i][j]=dp[i−1][j]
第i个物品小于等于背包容量,可以放入,则比较两种情况即放入和不放入,如果不放入i,最大价值就和 i 无关,就是 dp[i-1][j] , 如果放入第 i 个物品,价值就是 dp[i−1][j−w[i]]+val[i],我们只需取最大值即可,选择最优解dp[i][j]=maxdp[i−1][j],dp[i−1][j−w[i]]+val[i]。
c++
1 2 3 4
if j<w[i] dp[i][j]=dp[i-1][j] else dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+val[i])
class Solution { public: int lengthOfLIS(vector<int>& nums) { int n =nums.size(); if (n == 0) return0; vector<int>dp(n,1); for(int i =1;i<n;i++) for(int j=0;j<i;j++){ if(nums[i]>nums[j]) dp[i]=max(dp[j]+1,dp[i]); } return *max_element(dp.begin(), dp.end()); } };
class Solution { public: int maxProfit(vector<int>& prices) { int res = 0; int min_val = 0x3f3f3f; //无穷大 for (int i = 0; i < prices.size(); i++) { min_val = min(min_val, prices[i]); res = max(res, prices[i] - min_val); } return res; } };