01背包 2维数组实现
public class solution{
public static void main(){
int[] weight = {1,3,4};
int[] value = {15,20,30};
int bagSize = 4;
help(weight,value,bagSize);
for (int i = 0; i < goods; i++) {
for (int j = 0; j <= bagSize; j++) {
System.out.print(dp[i][j] + "\t");
}
System.out.println("\n");
}
}
private int help(int[] weight, int[] value, int bagsize){
int goods = weight.length;
int[][] dp = new int[goods][bagsize + 1];
for(int j = 0; j <= bagsize;i++){
if(weight[0] <= j){
dp[0][j] = value[0];
}
}
for(int i = 0; i < goods;i++){
dp[i][0] = 0;
}
for(int i = 1; i < goods;i++){
for(int j = 1; j <= bagsize;j++){
if(j < weight[i]){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-value[i]]+value[i]);
}
}
}
return dp[goods-1][bagsize];
}
}
01背包一维数组实现
for(int i = 0; i < goods;i++){
for(int j = bagweight[bagweight.length]; j >= bagweight[0];j--){
d[j] = Math.max(dp[j],dp[j-weight[i]]+value[i]);
}
}
416. 分割等和子集
class Solution {
public boolean canPartition(int[] nums) {
int[] weight = nums;
int[] value = nums;
int sum = 0;
for(int num : nums){
sum += num;
}
if(sum%2!=0)return false;
int tartget = sum/2;
int[] dp = new int[tartget+1];
for(int i = 0; i < nums.length;i++){
for(int j = tartget; j >= weight[i];j--){
dp[j] = Math.max(dp[j],dp[j-weight[i]]+value[i]);
}
}
return dp[tartget] == tartget;
}
}