您的位置:首页 > 其它

背包问题

2015-11-04 16:47 302 查看
背包问题
时间限制: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
;

int v[] = new int
;

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: