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];
}