背包问题
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;
}
}
时间限制: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;
}
}
相关文章推荐
- eclipse 常用快捷键
- node.js在执行js文件时出现SystaxError:Unexpected identifier的错误??
- Disable Maven Nature
- SQL中的JOIN和UNION的用法
- Python调用C/C++的种种方法
- Android QQ登陆
- windows下搭建nexusphp傻瓜式教程
- java读取csv文件
- ORA-1653: unable to extend table GGS.GGS_DDL_HIST
- spark sql
- C语言中scanf函数输入回车符的问题
- eclipse最有用快捷键整理
- web调试时,无法命中断点
- 让tab导航在手机移动端有平滑滑动的效果
- 解决WinForm(C#)中MDI子窗体最大化跑偏的问题
- android application生命周期介绍
- ArcGISServer10.0修改服务MaxImageWidth、MaxImageHeight大小
- C语言内存地址基础
- Deep Learning(深度学习)
- PostgreSQL表的行数统计