美文网首页
任务分配——01背包问题

任务分配——01背包问题

作者: 四喜汤圆 | 来源:发表于2018-09-18 10:00 被阅读27次

一、相关概念

二、题目

题目


思路

背包问题

代码

import java.util.Scanner;

public class 任务执行 {
    
    public static void main(String[] args) {
        new 任务执行().exe();
    }
    
    private void exe(){
        Scanner scan=new Scanner(System.in);
        // 任务个数
        int N=scan.nextInt();
        // 背包容量
        int T=scan.nextInt();
        // 完成任务最小时间
        int[] A=new int[N+1];
        // 完成任务最大时间
        int[] B=new int[N+1];
        for(int i=1;i<=N;i++){
            A[i]=scan.nextInt();
            B[i]=scan.nextInt();
        }
        int r=process(A,B,N,T);
        System.out.println(r);
    }

    /**
     * 
     * @param A:最小时间
     * @param B:最大时间
     * @param N:物品个数
     * @param T:背包容量
     * @return
     */
    private int process(int[] A, int[] B, int N, int T) {
        int[][] f=new int[N+1][T+1];
        for(int i=1;i<=N;i++){
            for(int j=1;j<=T;j++){
                if(j<A[i]){
                    // 最大最小都放不下
                    f[i][j]=f[i-1][j];// 在有限的空间把前i-1件物品放好就行了
                }else if(A[i]<= j && j<B[i]){
                    // 只能放下最下,放不下最大
                    // 不放或放
                    f[i][j]=Math.max(f[i-1][j], f[i-1][j-A[i]]+A[i]);
                }else{
                    // j>=B[i]:可放下最大的
                    // 假设放最小的
                    int min=Math.max(f[i-1][j], f[i-1][j-A[i]]+A[i]);
                    int max=Math.max(f[i-1][j],  f[i-1][j-B[i]]+B[i]);
                    f[i][j]=Math.max(min, max);
                }
            }
        }
        for(int i=1;i<=N;i++){
            for(int j=1;j<=T;j++){
                System.out.print(f[i][j]+"\t");
            }
            System.out.println();
        }
        return f[N][T];
    }

}

参考文献

import java.util.Scanner;

/**
 * Created by zfr on 2018/09/11.
 */
public class 百度 {
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int T =scanner.nextInt();
        int[][] nums = new int[N][2];
        for(int i = 0 ;i<N;i++){
            nums[i][0] = scanner.nextInt();
            nums[i][1] = scanner.nextInt();
        }
        int[][] res = new int[N+1][T+1];
        int max = 0;
        for(int i = 1 ; i < N ; i++){
            for(int j = 1 ; j <= T;j++){
                //分情况讨论
                if(nums[i][0] > j){//容量不够,不放
                    res[i][j] = res[i-1][j];
                }else if(nums[i][1] > j){//选择放Ai或者最大值
                    res[i][j] = Math.max(res[i-1][j] , res[i-1][j - nums[i][0]] + nums[i][0]);
                }else {//选择放Bi或者最大值
                    res[i][j] = Math.max(res[i-1][j] , res[i-1][j - nums[i][1]] + nums[i][1]);
                }
                max = Math.max(max,res[i][j]);
            }
        }
        System.out.println(max);
    }
}

相关文章

  • 任务分配——01背包问题

    一、相关概念 二、题目 题目 思路 背包问题 代码 参考文献

  • 动态规划-背包问题

    01背包问题 详解:01背包问题详解链接

  • 背包问题1(01背包)

    N件物品,没见有重量Wi,价值Vi;选其中几件放入容量为M的背包中,求价值的最值。——经典背包问题背包问题分三类:...

  • 01背包问题

    动态规划算法一般用来求解最优化问题,当问题有很多可行解,而题目要求寻找这些解当中的“最大值”/“最小值”时,通常可...

  • 01背包问题

    题目描述:给定 n 个物品和一个容量为 W 的背包,物品 i 的重量是 wi,其价值为 vi 。应该如何选择装入背...

  • 01背包问题

    有n个重量和价值分别为wi,vi的物品。从这些物体中挑选出总重量不超过W的物品,求所有方案中价值总和的最大值。 1...

  • 01背包问题

    A - Bone Collector Many years ago , in Teddy’s hometown t...

  • 01背包问题

    令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则...

  • 01背包问题

    题目:有A(2kg,6$);B(2kg,3$);C(6kg,5$);D(5kg,4$);E(4kg,6$)五种物品...

  • 01背包问题

    题目: 有限个数的货物,具有不同的体积还有价值,怎么让其放进有限体积的背包并价值最大。 货物只有两种可能,放进去/...

网友评论

      本文标题:任务分配——01背包问题

      本文链接:https://www.haomeiwen.com/subject/jmrpgftx.html