最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

背包問題

2023-08-14 21:32 作者:furiousiTy  | 我要投稿

這是一個經(jīng)典的背包問題,可以使用動態(tài)規(guī)劃來解決。以下是使用 Java 編寫的示例代碼:


```java

import java.util.Scanner;


public class Main {

? ? public static void main(String[] args) {

? ? ? ? Scanner scanner = new Scanner(System.in);

? ? ? ? int N = scanner.nextInt(); // 物品數(shù)量

? ? ? ? int V = scanner.nextInt(); // 背包容量


? ? ? ? int[] volumes = new int[N + 1];

? ? ? ? int[] values = new int[N + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? volumes[i] = scanner.nextInt();

? ? ? ? ? ? values[i] = scanner.nextInt();

? ? ? ? }


? ? ? ? int[][] dp = new int[N + 1][V + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? for (int j = 0; j <= V; j++) {

? ? ? ? ? ? ? ? dp[i][j] = dp[i - 1][j];

? ? ? ? ? ? ? ? if (j >= volumes[i]) {

? ? ? ? ? ? ? ? ? ? dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - volumes[i]] + values[i]);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? System.out.println(dp[N][V]);

? ? }

}

```


在這個示例中,我們使用二維數(shù)組 `dp[i][j]` 來表示考慮前 i 件物品,在背包容量為 j 的情況下的最大價值。我們使用動態(tài)規(guī)劃的思想填充這個數(shù)組,從而求解最大價值。最終結(jié)果位于 `dp[N][V]`。


請將以上代碼保存為一個文件(例如:Main.java),然后在命令行中使用 Java 編譯器編譯它,然后運(yùn)行生成的編譯文件即可得到輸出結(jié)果。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

這是一個背包問題的變種,每種物品可以選擇無限次放入背包。您仍然可以使用動態(tài)規(guī)劃來解決。以下是使用 Java 編寫的示例代碼:


```java

import java.util.Scanner;


public class Main {

? ? public static void main(String[] args) {

? ? ? ? Scanner scanner = new Scanner(System.in);

? ? ? ? int N = scanner.nextInt(); // 物品種數(shù)

? ? ? ? int V = scanner.nextInt(); // 背包容量


? ? ? ? int[] volumes = new int[N + 1];

? ? ? ? int[] values = new int[N + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? volumes[i] = scanner.nextInt();

? ? ? ? ? ? values[i] = scanner.nextInt();

? ? ? ? }


? ? ? ? int[] dp = new int[V + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? for (int j = volumes[i]; j <= V; j++) {

? ? ? ? ? ? ? ? dp[j] = Math.max(dp[j], dp[j - volumes[i]] + values[i]);

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? System.out.println(dp[V]);

? ? }

}

```


在這個示例中,我們只使用一維數(shù)組 `dp[j]` 來表示背包容量為 j 時的最大價值。我們使用動態(tài)規(guī)劃的思想填充這個數(shù)組,從而求解最大價值。最終結(jié)果位于 `dp[V]`。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

這是一個多重背包問題,可以使用單調(diào)隊列優(yōu)化的方法來解決。以下是使用 Java 編寫的示例代碼:


```java

import java.util.Scanner;


public class Main {

? ? public static void main(String[] args) {

? ? ? ? Scanner scanner = new Scanner(System.in);

? ? ? ? int N = scanner.nextInt(); // 物品種數(shù)

? ? ? ? int V = scanner.nextInt(); // 背包容量


? ? ? ? int[] volumes = new int[N + 1];

? ? ? ? int[] values = new int[N + 1];

? ? ? ? int[] quantities = new int[N + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? volumes[i] = scanner.nextInt();

? ? ? ? ? ? values[i] = scanner.nextInt();

? ? ? ? ? ? quantities[i] = scanner.nextInt();

? ? ? ? }


? ? ? ? int[] dp = new int[V + 1];


? ? ? ? for (int i = 1; i <= N; i++) {

? ? ? ? ? ? for (int j = 0; j < volumes[i]; j++) {

? ? ? ? ? ? ? ? int[] queue = new int[quantities[i] + 1];

? ? ? ? ? ? ? ? int head = 1, tail = 0;

? ? ? ? ? ? ? ? for (int k = 0; k * volumes[i] + j <= V; k++) {

? ? ? ? ? ? ? ? ? ? int val = dp[k * volumes[i] + j] - k * values[i];

? ? ? ? ? ? ? ? ? ? while (head <= tail && queue[tail] <= val) {

? ? ? ? ? ? ? ? ? ? ? ? tail--;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? tail++;

? ? ? ? ? ? ? ? ? ? queue[tail] = val;

? ? ? ? ? ? ? ? ? ? dp[k * volumes[i] + j] = queue[head] + k * values[i];

? ? ? ? ? ? ? ? ? ? if (head <= tail && k - quantities[i] >= 0 && queue[head] == dp[(k - quantities[i]) * volumes[i] + j]) {

? ? ? ? ? ? ? ? ? ? ? ? head++;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }


? ? ? ? System.out.println(dp[V]);

? ? }

}

```


在這個示例中,我們使用了單調(diào)隊列來優(yōu)化多重背包問題的解決。通過在每種物品的循環(huán)中,利用單調(diào)隊列維護(hù)一個滑動窗口,可以將問題轉(zhuǎn)化為 01 背包問題。最終結(jié)果位于 `dp[V]`。


請將以上代碼保存為一個文件(例如:Main.java),然后在命令行中使用 Java 編譯器編譯它,然后運(yùn)行生成的編譯文件即可得到輸出結(jié)果。


背包問題的評論 (共 條)

分享到微博請遵守國家法律
黄平县| 万年县| 昆明市| 会泽县| 隆林| 楚雄市| 施甸县| 岑巩县| 新津县| 津市市| 福州市| 右玉县| 聂拉木县| 汽车| 海丰县| 林甸县| 永靖县| 宝清县| 普兰县| 汶川县| 江山市| 贵德县| 南华县| 建宁县| 陇西县| 安庆市| 清涧县| 博兴县| 和田市| 苍南县| 岳池县| 山阴县| 南和县| 通许县| 铜川市| 辽中县| 舞阳县| 九寨沟县| 彩票| 龙游县| 怀来县|