416. 分割等和子集
由于算法老师和自己太给力了,01背包问题一直一知半解,这次遇见经典背包动态规划都不会
然后在看了题解出现了很多问题,由于不方便调试,所以就硬看,特别痛苦

查看代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
sum+=nums[i];
}
int target = sum/2;
if(sum%2==1||nums[nums.size()-1]>target){
return false;
}
vector<vector<bool>>temp(nums.size(),vector<bool>(target+1,false));
for(int i=0;i<nums.size();i++){
temp[i][0]=true;
}
for(int i=1;i<nums.size();i++){
for(int j =1;j<=target; j++){
if(j<nums[i]){
if(i==0){
continue;
}
else{
temp[i][j] = temp[i-1][j];
}
}
else{
if(i==0){
temp[i][j] = temp[i][j-nums[i]];
}
else{
temp[i][j]=temp[i-1][j]||temp[i-1][j-nums[i]];
}
}
}
if(temp[i][target]==true){
return true;
}
}
temp[nums.size()-1][target+10]=false;
return false;
}
};
然后就是没看题解出错的代码
查看代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum=0;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
sum+=nums[i];
}
int target = sum/2;
if(sum%2==1||nums[nums.size()-1]>target){
return false;
}
vector<vector<bool>>temp(nums.size(),vector<bool>(target+1,false));
temp[0][0]=true;
for(int i=1;i<nums.size();i++){
for(int j =1;j<=target; j++){
if(j<nums[i]){
if(i==0){
continue;
}
else{
temp[i][j] = temp[i-1][j];
}
}
else{
if(i==0){
temp[i][j] = temp[i][j-nums[i]];
}
else{
temp[i][j]=temp[i-1][j]||temp[i-1][j-nums[i]];
}
}
}
if(temp[i][target]==true){
return true;
}
}
temp[nums.size()-1][target+10]=false;
return false;
}
};

浙公网安备 33010602011771号