背包问题

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值