563. 背包问题 V
给出 n 个物品, 以及一个数组, nums[i]
代表第i个物品的大小, 保证大小均为正数并且没有重复, 正整数 target
表示背包的大小, 找到能填满背包的方案数。每一个物品只能使用一次
样例
给出候选物品集合 [1,2,3,3,7]
以及 target 7
结果的集合为:
[7]
[1,3,3]
返回 2
思路:2种情况。1.第i个物品不在背包。
2.第i个物品在背包。
2.1.只有第i个物品 。2.2.有第i个物品和0—i-1的物品。
public class Solution {
/**
* @param nums: an integer array and all positive numbers
* @param target: An integer
* @return: An integer
*/
public int backPackV(int[] nums, int t) {
int[][] dp=new int[nums.length][t+1];
for(int i=0;i<nums.length;i++){
for(int j=0;j<=t;j++){
if(i==0) dp[i][j]=j==nums[i]?1:0;
else{
dp[i][j]=dp[i-1][j];
if(j-nums[i]>0){
dp[i][j]+=dp[i-1][j-nums[i]];
}
if(j-nums[i]==0) dp[i][j]++;
}
}
}
return dp[nums.length-1][t];
}
}
440. 背包问题 III
给定n种具有大小 Ai
和价值 Vi
的物品(每个物品可以取用无限次
)和一个大小为 m
的一个背包, 你可以放入背包里的最大价值是多少?
样例
给出四个物品, 大小为 [2, 3, 5, 7]
, 价值为 [1, 5, 2, 4]
, 和一个大小为 10
的背包. 最大的价值为 15
.
注意事项
你不能将物品分成小块, 选择的项目的总大小应 小于或等于
m.
思路:2种情况。
最后第i个存在或不存在。
public class Solution {
/**
* @param A: an integer array
* @param V: an integer array
* @param m: An integer
* @return: an array
*/
public int backPackIII(int[] A, int[] V, int m) {
if(A.length==0) return 0;
int[][] dp=new int[A.length][m+1];
for(int i=0;i<A.length;i++){
for(int j=0;j<=m;j++){
if(i==0){
dp[i][j]=j-A[i]>=0?dp[i][j-A[i]]+V[i]:0;
}
else{
dp[i][j]=dp[i-1][j];
if(j-A[i]>=0){
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-A[i]]+V[i]);
}
}
}
}
return dp[A.length-1][m];
}
}
背包问题VII
描述
假设你身上有 n 元,超市里有多种大米可以选择,每种大米都是袋装的,必须整袋购买,给出每种大米的重量,价格以及数量,求最多能买多少公斤的大米
样例
Given:
n = 8
prices = [2,4]
weight = [100,100]
amounts = [4,2]
Return:400
/**
* @param n: the money of you
* @param prices: the price of rice[i]
* @param weight: the weight of rice[i]
* @param amounts: the amount of rice[i]
* @return: the maximum weight
*/
public int backPackVII(int n, int[] prices, int[] weight, int[] amounts) {
if(prices.length==0) return 0;
int[][] dp=new int[prices.length][n+1];
for(int i=0;i<prices.length;i++) {
for(int j=0;j<=n;j++) {
if(i==0) {
dp[i][j]=(j-prices[i]<0)?0:(dp[i][j-prices[i]]+weight[i]);
continue;
}
for(int k=0;k<amounts.length&&j-k*prices[i]>=0;k++) {
dp[i][j]=Math.max(dp[i][j],dp[i-1][j-k*prices[i]]+k*weight[i]);
}
}
}
return dp[prices.length-1][n];
}