classSolution{public:boolcanPartitionKSubsets(vector<int>& nums,int k){int all =accumulate(nums.begin(), nums.end(),0);if(all % k >0){returnfalse;}int per = all / k;sort(nums.begin(), nums.end());if(nums.back()> per){returnfalse;}int n = nums.size();
vector<bool>dp(1<< n,false);
vector<int>curSum(1<< n,0);
dp[0]=true;for(int i =0; i <1<< n; i++){if(!dp[i]){continue;}for(int j =0; j < n; j++){if(curSum[i]+ nums[j]> per){break;}if(((i >> j)&1)==0){int next = i |(1<< j);if(!dp[next]){
curSum[next]=(curSum[i]+ nums[j])% per;
dp[next]=true;}}}}return dp[(1<< n)-1];}};
1954. 收集足够苹果的最小花园周长
代码实现(贪心)
classSolution{public:longlongminimumPerimeter(longlong neededApples){
vector<longlong> nums;longlong i;
nums.push_back(0);for(i =2; i <=1000000; i +=2){
nums.push_back(nums.back()+3* i * i);if(nums.back()>= neededApples)break;}return i *4;}};
1027. 最长等差数列
代码实现(动态规划)
classSolution{public:intlongestArithSeqLength(vector<int>& nums){int ans =0;
unordered_map<int,int> myMap;
vector<vector<int>>dp(nums.size(),vector<int>(nums.size()));for(int i =0; i < nums.size(); i++){for(int j = i +1; j < nums.size(); j++){int target =2* nums[i]- nums[j];if(myMap.count(target)){
dp[i][j]= dp[myMap[target]][i]+1;}
ans =max(ans, dp[i][j]);}
myMap[nums[i]]= i;}return ans +2;}};