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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【贪心算法】-背包问题

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

🚀貪心算法-背包問題

貪心算是把一個復雜問題分解為一系列較為簡單的局部最優選擇,每一步的選擇都是對當前解得一個擴展,直到的到問題的完整解,貪心法的典型應用是求解最優化問題,而且對于許多問題都能得到整體最優解,即使不能得到最優解,通常也是最優解的近似。——《算法設計與分析》


我對貪心法的理解:說到貪心法,和動態規劃有許多相同的地方,比如都是求最優解的算法,但是動態規劃是通過找到動態規劃方程,通過動態規劃方程一步步推出最優解,而且一般都是最優解,每次決策和上一次決策有關系,具有很明確的求解目的;貪心法是通過用一個局部最優的策略去求整體最優,需要明確的是局部最優不一定推出整體最優,所以貪心法求出的整體解可能不是最優解,相對動態規劃的復雜,如果問題對最優解不是很嚴格,可以接受近似解,貪心法不為是一種折中的選擇。

1??題目

給定n個物品和一個容量為cap的背包,物品i的重量為wi,價值為vi的背包問題(不是o/1背包,物品可以被拆分放入)

具體題目:

有三個物品,物品重量和價值分別為{20,30,10},{60,120,50},背包的容量為50,求出放入背包物品的最大價值。

2??思路

對于求放入背包物品的最大價值是多少,根據最優策略的不同,得到的結果也不盡相同,按照常理,一般我們會選擇單位重量價值大的物品先放入背包,當然還有以價值最大優先,以重量最小優先,這里以單位重量價值大優先


算法部分getMaxValue需要注意的

  • 求性價比排序后,如何使物品的重量價值和性價比對應起來。

    最粗暴的方式使,自己手動寫一個多維排序,性價比排序的同時,也讓物品的重量和價值排序,通過索引對應起來。

    簡單方式,通過用一個二維數組把性價比和重量存一起,然后通過Arrays.sort()的自定義二維數組排序,對性價比進行排序,這樣就實現了對應,至于價值可以通過性價比和重量推出來

  • 物品不能整個放入背包,劃分后再放入

  • 3??代碼

    輸入及輸出

    請輸入背包容量和物品個數
    50 3
    請輸入背包重量和價值(空格隔開):
    20 60 30 120 10 50
    放入背包的最大價值是:200

    import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class knapsack {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請輸入背包容量和物品個數");int cap = sc.nextInt();int num = sc.nextInt();System.out.println("請輸入背包重量和價值(空格隔開):");int[] w = new int[num];int[] v = new int[num];for(int i=0;i<num;i++) {w[i] = sc.nextInt();v[i] = sc.nextInt();}System.out.println("放入背包的最大價值是:"+getMaxValue(w, v, cap));}private static int getMaxValue(int[] w,int[] v,int cap) {int len = w.length;//得到價值比 價值比和物品重量int[][] goods = new int[len][2];for(int i=0;i<len;i++) {int ratio = v[i]/w[i];goods[i][0] = ratio;goods[i][1] = w[i];}//對價值比進行排序Arrays.sort(goods,new Comparator<int[]>(){public int compare(int[] a,int[] b) {return a[0]-b[0];}});int max = 0;//遍歷物品,價值比最大的優先加入背包,物品可拆分for(int i=len-1;cap>0&&i>=0;i--) {int mv = goods[i][0];int w1 = goods[i][1];int v1 = goods[i][0]*goods[i][1];if(goods[i][1]<cap) { //可以放入背包max += v1;cap-=w1;} else {//物品放不入背包,對物品進行拆分max +=((double)cap/w1)*v1;}}return max;} }

    總結

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

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