二维费用的背包问题

题目来源
在这里插入图片描述
比之前的01背包问题多了一个重量,解法还是一样的。
状态转移方程:

dp[i][j][k] = max(dp[i-1][j][k],dp[i-1][j-v[i]][k-m[i])+w[i])

优化成两维

dp[j][k] = max(dp[j][k],dp[j-v[i]][k-m[i])+w[i])

优化后,时间复杂度不变O(NVM),空间复杂度O(VM)

由于0<N≤1000,0<V,M≤100,总的时间复杂度为1000100100=10的七次方,应该是够的。(瞎仿着分析的……)

具体代码

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int o = sc.nextInt();
        int p = sc.nextInt();
        int q = sc.nextInt();
        int v[] = new int[o+1];
        int m[] = new int[o+1];
        int w[] = new int[o+1];
        for(int i = 1;i <= o;i++){
            v[i] = sc.nextInt();
            m[i] = sc.nextInt();
            w[i] = sc.nextInt();
        }
        int dp[][] = new int[p+1][q+1];
        for(int i = 1;i <= o;i++){
            for(int j = p;j>=0;j--){
                for(int k = q;k >= 0;k--){
                    dp[j][k] = dp[j][k];
                    if(j-v[i] >= 0 && k-m[i] >= 0){
                        dp[j][k] = Math.max(dp[j][k],dp[j-v[i]][k-m[i]]+w[i]);
                    }
                }
            }
        }
        System.out.println(dp[p][q]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值