背包问题

来源:互联网 发布:南昌市网络教育平台 编辑:程序博客网 时间:2024/06/05 12:43

背包问题

 时间限制:3000 ms  |           内存限制:65535 KB

难度:3

描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。输出输出每组测试数据中背包内的物品的价值和,每次输出占一行。

样例输入

1
3 15
5 10
2 8
3 9

样例输出

65

JAVA:

import java.util.Scanner;

public class Temo {

 public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  int s, n, W, v, w, i, j, k;
  s = input.nextInt();
  while (s-- != 0) {
   n = input.nextInt();
   W = input.nextInt();
   int V[]= new int[25];
   for(int a = 0; a < V.length; a++)
    V[a] = 0;
   for(i = 0; i < n; i++){
    v = input.nextInt();
    w = input.nextInt();
    for(j = 0; j < w; j++){
     for(k = W; k > 0; k--){
      V[k] = V[k-1] + v > V[k] ? V[k-1] + v : V[k];
     }
    }
   }
   System.out.println(V[W]);
  }
 }
}

优化前代码:

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {

  Scanner input = new Scanner(System.in);
  int k = input.nextInt();

  while (k-- != 0) {

   int n = input.nextInt();
   int W = input.nextInt();
   int w[] = new int[n];
   int v[] = new int[n];

   for (int i = 0; i < n; i++) {
    v[i] = input.nextInt();
    w[i] = input.nextInt();
   }
   
   System.out.println(result(W, n, w, v));
  }
 }

 private static int result(int W, int n, int[] w, int[] v) {
  int sum = 0;
  int temp = 0;

  for (int i = 0; i < n; i++) {
   for (int j = 1; j < n; j++) {
    if (v[j] > v[j - 1]) {
     temp = w[j];
     w[j] = w[j - 1];
     w[j - 1] = temp;

     temp = v[j];
     v[j] = v[j - 1];
     v[j - 1] = temp;
    }
   }
  }

  for (int i = 0; i < n; i++) {
   if (W > w[i]) {
    sum += w[i] * v[i];
    W -= w[i];
   } else {
    sum += W * v[i];
    break;
   }
  }

  return sum;
 }
}

 

0 0
原创粉丝点击