欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java背包問題動態(tài)規(guī)劃算法分析

 更新時間:2021年04月08日 15:58:28   作者:灰古  
這篇文章主要介紹了java背包問題動態(tài)規(guī)劃算法分析,想了解算法的同學(xué)一定要看一下

背包問題

【題目描述】
一個旅行者有一個最多能裝 MM 公斤的背包,現(xiàn)在有 nn 件物品,它們的重量分別是W1,W2,…,WnW1,W2,…,Wn,它們的價值分別為C1,C2,…,CnC1,C2,…,Cn,求旅行者能獲得最大總價值。

【輸入】
第一行:兩個整數(shù),MM(背包容量,M<=200M<=200)和NN(物品數(shù)量,N<=30N<=30);

第2…N+12…N+1行:每行二個整數(shù)Wi,CiWi,Ci,表示每個物品的重量和價值。

【輸出】
僅一行,一個數(shù),表示最大總價值。

【輸入樣例】
10 4
2 1
3 3
4 5
7 9
【輸出樣例】
12

我們可以通過自己打表的方式找變化求得狀態(tài)方程
(橫向表示容量,j)(縱向表示第幾個,i)
#1 2 3 4 5 6 7 8 9 10
1 0 1 1 1 1 1 1 1 1 1
2 0 1 3 3 4 4 4 4 4 4
3 0 1 3 5 5 6 8 8 9 9
4 0 1 3 5 5 6 9 9 10 12

dp[i][j]----i表示物品個數(shù),j表示容量,dp[i][j]的值表示在此狀態(tài)的最大價值
由此我們可以寫出狀態(tài)轉(zhuǎn)移方程:

if(j<w[i])//當(dāng)容量小于重量,即不拿的情況下
	dp[i][j]=dp[i-1][j]//等于上一次的值
else
	 dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);

完整代碼如下:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m, n;
        int[] w = new int[35];
        int[] v = new int[35];
        m = in.nextInt();
        n = in.nextInt();
        int[][] dp = new int[35][205];//m容量,n數(shù)目個數(shù)

        for (int i = 1; i <= n; i++) {
            w[i] = in.nextInt();
            v[i] = in.nextInt();
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if(j<w[i])
                {
                    dp[i][j]=dp[i-1][j];
                }else
                {
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                }
            }
        }
        //輸出dp數(shù)組
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println(dp[n][m]);
        in.close();
    }
}

當(dāng)然,如果容量數(shù)字和物品個數(shù)很大的時候,這個表會很大,但是dp數(shù)組只與自己的上一次有關(guān),會造成空間浪費,所以我們可以改進(jìn)成滾動數(shù)組,減小空間,使其變成一維數(shù)組。

小tips:因為是滾動數(shù)組,所以如果第二層循環(huán)從1開始的話,可能會覆蓋上一次的值,所以第二層循環(huán)的時候我們從后往前開始!

import java.util.*;
import java.lang.*;

public class Main {
    static int[]dp=new int[205];
    static int[] w = new int[35];
    static int[] v = new int[35];
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m, n;
        m = in.nextInt();
        n = in.nextInt();
//        int[][] dp = new int[35][205];//m容量,n數(shù)目個數(shù)


        for (int i = 1; i <= n; i++) {
            w[i] = in.nextInt();
            v[i] = in.nextInt();
        }

        for (int i = 1; i <= n; i++) {
            for (int j = m; j >= 1; j--) {
                if(j>=w[i])
                {
                    dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);
                }
            }

        }
        //輸出dp數(shù)組
//        for (int i = 1; i <= n; i++) {
//            for (int j = 1; j <= m; j++) {
//                System.out.print(dp[i][j]+" ");
//            }
//            System.out.println();
//        }
//        System.out.println(dp[n][m]);
        System.out.println(dp[m]);
        in.close();
    }
}

以上就是java動態(tài)規(guī)劃算法之背包問題的詳細(xì)內(nèi)容,更多關(guān)于java動態(tài)規(guī)劃背包的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java集合框架源碼分析之LinkedHashMap詳解

    Java集合框架源碼分析之LinkedHashMap詳解

    這篇文章主要介紹了Java集合框架源碼分析之LinkedHashMap詳解,內(nèi)容包括了linkedhashmap的簡介和源碼剖析以及關(guān)于LinkedHashMap的源碼總結(jié),內(nèi)容豐富,需要的朋友可以參考下。
    2017-09-09
  • 深入理解Spring中bean的生命周期介紹

    深入理解Spring中bean的生命周期介紹

    本篇文章主要介紹了深入理解Spring中bean的生命周期介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java反射入門、原理與使用方法詳解

    Java反射入門、原理與使用方法詳解

    這篇文章主要介紹了Java反射入門、原理與使用方法,結(jié)合實例形式詳細(xì)分析了java反射的概念、原理、使用方法與相關(guān)操作注意事項,需要的朋友可以參考下
    2015-07-07
  • Java日期相關(guān)API的基本操作總結(jié)

    Java日期相關(guān)API的基本操作總結(jié)

    大概總結(jié)一下日期相關(guān)API操作原因是對于日期的操作我們開發(fā)中還是很常見的,包括在數(shù)據(jù)庫中保存日期,以及之前String類中對字符串的一些處理開發(fā)中都很常見,希望對大家有所幫助
    2022-11-11
  • Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行

    Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行

    這篇文章主要介紹了Java并發(fā)編程示例(一):線程的創(chuàng)建和執(zhí)行,本文是系列文章的第一篇,需要的朋友可以參考下
    2014-12-12
  • springboot如何集成mysql

    springboot如何集成mysql

    這篇文章主要介紹了springboot如何集成mysql問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringMVC中處理Ajax請求的示例

    SpringMVC中處理Ajax請求的示例

    本篇文章給大家介紹SpringMVC中處理Ajax請求的示例,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • 解決nacos的yml配置文件解析@開頭的值啟動報錯問題

    解決nacos的yml配置文件解析@開頭的值啟動報錯問題

    這篇文章主要介紹了解決nacos的yml配置文件解析@開頭的值啟動報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • struts2+spring+ibatis框架整合實現(xiàn)增刪改查

    struts2+spring+ibatis框架整合實現(xiàn)增刪改查

    這篇文章主要為大家詳細(xì)介紹了struts2+spring+ibatis框架整合實現(xiàn)增刪改查操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java中Jar包反編譯解壓和壓縮操作方法

    Java中Jar包反編譯解壓和壓縮操作方法

    JAR文件就是Java 檔案文件Java Archive,它是 Java 的一種文檔格式,這篇文章主要介紹了Java中Jar包反編譯解壓和壓縮,需要的朋友可以參考下
    2023-09-09

最新評論