22号就要复试了,专业课,英语都还没搞,我的吗,先每天刷10道旧题在刷新题把。

int max(int i,int j){
    if(i>j) return i;
    return j;
}

bool canPartition(int* nums, int numsSize) {
    int sum=0;
    for(int i=0;i<numsSize;i++){
        sum+=nums[i];
    }
    if(sum%2!=0) return false;
    int size=sum/2;
    int** dp=(int**)malloc(sizeof(int*)*numsSize);
    for(int i=0;i<numsSize;i++) dp[i]=(int*)malloc(sizeof(int)*(size+1));
    for(int i=0;i<numsSize;i++) dp[i][0]=0;
    for(int i=nums[0];i<=size;i++) dp[0][i]=nums[0];
    for(int i=1;i<numsSize;i++){
        for(int j=1;j<=size;j++){
            if(nums[i]>j){
                dp[i][j]=dp[i-1][j];
            }else{
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-nums[i]]+nums[i]);
            }
            if(dp[i][j]==sum/2) return true;
        }
    }    
    return false;
}

结果: