算法刷题 DAY43

1049.最后一块石头的重量II

int lastStoneWeightII(int* stones, int stonesSize) {
    //分成两堆尽可能相同的石头
     int sum=0;
    int* dp=(int*)calloc(20500,sizeof(int));
    for(int i=0;i=stones[i];j--){
            dp[j]=fmax(dp[j],dp[j-stones[i]]+stones[i]);
        }
    }
   
    return sum-2*dp[target];
    //一堆重sum-dp[target];另一堆重dp[target]
    //sum-dp[target]>dp[target] //target=sum/2是向下取整的→sum-d[target]>target
}

494.目标和

int findTargetSumWays(int* nums, int numsSize, int target) {

    int sum=0;
    for(int i=0;isum) return 0;//无方案
    if((sum+target)%2==1) return 0;//背包重量无法求→无方案
    int bag_size=(sum+target)/2;
    int dp[20005]={0};//dp[j]:装满容量为j的背包有多少种方法
    dp[0]=1;//求多少种装法→1;能装最大重量→0

    for(int i=0;i=nums[i];j--){
            dp[j]+=dp[j-nums[i]];//dp[j]:装满容量为j的背包有多少种方法
        }
    }
    
    return dp[bag_size];
}

474.一和零

int findMaxForm(char** strs, int strsSize, int m, int n) {

    int dp[m+1][n+1];//记得+1
    //dp[i][j]:能装i个0,j个1的背包可存放的最大字符串个数
    for(int i=0;i<=m;i++){
        for(int j=0;j<=n;j++){
            dp[i][j]=0;
        }
    }

    for(int i=0;i=x;k--){//再遍历背包
           for(int h=n;h>=y;h--){
               dp[k][h]=fmax(dp[k][h],dp[k-x][h-y]+1);//求最大值要加value[i](+1)
               //dp[i][j]:能装i个0,j个1的背包可存放的最大字符串个数
           }
       }

    }
    
    return dp[m][n];
}

你可能感兴趣的:(算法,java,数据结构,leetcode,c语言,c++)