动态规划:01背包理论基础
题目
链接
代码
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int N = sc.nextInt();
int[]cost = new int[M];
int[]value = new int[M];
for(int i =0;i<M;i++){
cost[i] = sc.nextInt();
}
for(int i =0;i<M;i++){
value[i] = sc.nextInt();
}
int[][]dp = new int[M][N+1];
for(int j=cost[0];j<=N;j++){
dp[0][j] = value[0];
}
for(int i=1;i<M;i++){
for(int j=1;j<=N;j++){
if(cost[i]<=j){
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-cost[i]]+value[i]);
}else{
dp[i][j] = dp[i-1][j];
}
}
}
System.out.println(dp[M-1][N]);
}
}
416. 分割等和子集
题目
链接
代码
class Solution {
public boolean canPartition(int[] nums) {
if(nums.length<=1){
return false;
}
int sumNum = 0;
for(int i =0;i<nums.length;i++){
sumNum += nums[i];
}
if(sumNum%2==1){
return false;
}
int subNum = sumNum/2;
int[] dp = new int[subNum+1];
for(int j = nums[0];j<dp.length;j++){
dp[j] = nums[0];
}
for(int i = 1;i<nums.length;i++){
for(int j = dp.length-1;j>=nums[i];j--){
dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);
}
}
return dp[subNum]==subNum;
}
}
1049. 最后一块石头的重量 II
题目
链接
代码
class Solution {
public int lastStoneWeightII(int[] stones) {
if(stones.length==1){
return stones[0];
}
int sum =0;
for(int i =0;i<stones.length;i++){
sum += stones[i];
}
int temp = sum/2;
int [] dp = new int[temp+1];
for(int j = stones[0];j<dp.length;j++){
dp[j] = stones[0];
}
for(int i =1;i<stones.length;i++){
for(int j = dp.length-1;j>=stones[i];j--){
dp[j] = Math.max(dp[j],dp[j-stones[i]]+stones[i]);
}
}
return sum- dp[temp]*2;
}
}