日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贪心问题JAVA_java背包问题(贪心法)

發布時間:2024/10/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心问题JAVA_java背包问题(贪心法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

完全背包問題

一個旅行者有一個最多能用m公斤的背包,現在有n種物品,每件的重量分別是W1,W2,...,Wn,每件的價值分別為C1,C2,...,Cn.若的每種物品的件數足夠多.求旅行者能獲得的最大總價值。

貪心法:貪心法又叫貪婪算法,是指,對問題求解時,總是找出當前局部最優解。也就是說,不從整體最優考慮,

它所找出的某種意義上的局部的最優解。貪心算法并不是對所有問題一定能找出整體的最優解。但對范圍相當廣泛

的許多問題他能產生整體最優解或者是整體最優解的近似解。

輸入示例:

17

3 4 7 8 9

4 5 10 11 13

其得出的結果為23,但最優解為24.

基本思想:

選一個度量標準,根據這個標準進行排序,以這個標準進行輸出,每輸出一個,判斷是否符合約束條件。

背包問題:

1.選擇標準:v(價值)/w(物品重量)

2.然后根據這個標準進行排序得到一個最有解集

3.根據最優解集,得到最大的價值

代碼:

package Recursion;

import java.util.Arrays;

import java.util.Scanner;

/**

* 背包貪心法

*

* @author ***

*

*/

public class Greedy {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

System.out.println("Please enter the number of objects(請輸入物品的數量:):");

int n = in.nextInt();

int[] w = new int[n]; // 物品重量數組

int[] v = new int[n]; // 物品價錢數組

System.out

.println("Now, please enter the weight of these objects(現在請輸入這些物品的重量:)");

for (int i = 0; i < n; i++) {

w[i] = in.nextInt();

}

System.out

.println("Now, please enter the value of these objects(現在請輸入這些物品的價值:)");

for (int i = 0; i < n; i++) {

v[i] = in.nextInt();

}

System.out

.println("Now, please enter the capacity of the pack(現在請輸入背包的容量:)");

int c = in.nextInt();

/**

* 按單位重量價值r[i] = v[i] / w[i]降序排列

*

* ps:排序用到了選擇排序,詳情請查看選擇排序

*/

double startTime = System.currentTimeMillis();

double[] r = new double[n];

int[] index = new int[n];

for (int i = 0; i < n; i++) {

r[i] = (double) v[i] / (double) w[i];

index[i] = i;

}

double temp = 0;

for (int i = 0; i < n - 1; i++) {

for (int j = i + 1; j < n; j++) {

if (r[i] < r[j]) {

temp = r[i];

r[i] = r[j];

r[j] = temp;

int x = index[i];

index[i] = index[j];

index[j] = x;

}

}

}

/**

* 排序后的重量和價值分別存到w1[]和v1[]中

*/

int[] w1 = new int[n];

int[] v1 = new int[n];

for (int i = 0; i < n; i++) {

w1[i] = w[index[i]];

v1[i] = v[index[i]];

}

/**

* 初始化解向量x[n]

*/

int[] x = new int[n];

for (int i = 0; i < n; i++) {

x[i] = 0;

}

/**

* 求解并打印解向量

*/

for (int i = 0; i < n; i++) {// 9 7 8 3 4

if (w1[i] < c) {

x[i] = 1;

c = c - w1[i];

}

}

System.out

.println("The solution vector is(解向量是:)" + Arrays.toString(x));

/**

* 根據解向量求出背包中存放物品的最大價值并打印

*/

int maxValue = 0;

for (int i = 0; i < n; i++) {

if (x[i] == 1)

maxValue += v1[i];

}

double endTime = System.currentTimeMillis();

System.out

.println("Now, the largest values of objects in the pack is(背包中物品的最大價值為:)"

+ maxValue);

System.out.println("Basic Statements take(基本語句用時)"

+ (endTime - startTime) + " milliseconds!");

}

}

總結

以上是生活随笔為你收集整理的贪心问题JAVA_java背包问题(贪心法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。