赞
踩
题目链接:01背包问题 二维
踩坑:在考虑当前物品时,应先考虑当前的背包能不能放得下当前物品
思路:
代码:
# include<iostream> # include<vector> using namespace std; int main() { int n; int c; cin>>n>>c; vector<int> w(n, 0); for(int i = 0; i < n; i++) { int t; cin>>t; w[i] = t; } vector<int> p(n, 0); for(int i = 0; i < n; i++) { int t; cin>>t; p[i] = t; } vector<vector<int>> dp(n, vector<int>(c+1, 0)); for(int i = 0; i <= c; i++) { if(i >= w[0]) dp[0][i] = p[0]; } for(int i = 1; i < n; i++) { for(int j = 1; j <= c; j++) { 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]]+p[i]); } } cout<<dp[n-1][c]; return 0; }
题目链接:01背包问题 一维
踩坑:看了视频
思路:一维01背包问题是二维01背包问题的优化版,其核心在于,因为01背包当前行只依赖于上一行,所以可以只维护一个一维数组滚动更新。
代码:
# include<iostream> # include<vector> using namespace std; int main() { int n; int c; cin>>n>>c; vector<int> w(n, 0); for(int i = 0; i < n; i++) { int t; cin>>t; w[i] = t; } vector<int> p(n, 0); for(int i = 0; i < n; i++) { int t; cin>>t; p[i] = t; } vector<int> dp(c+1,0); for(int i = 0; i < n; i++) { for(int j = c; j >= w[i]; j--) { dp[j] = max(dp[j], dp[j-w[i]]+p[i]); } } cout<<dp[c]; return 0; }
题目链接:416. 分割等和子集
踩坑:倒序–
思路:有以下几个槛
代码:
class Solution { public: bool canPartition(vector<int>& nums) { int n = nums.size(); int c; if(accumulate(nums.begin(), nums.end(), 0)%2) return false; else c = accumulate(nums.begin(), nums.end(), 0)/2; vector<int> dp(c+1, 0); for(int i = 0; i < n; i++) { for(int j = c; j >= nums[i]; j--) { dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]); } } if(dp[c] == c) return true; else return false; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。