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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

背包问题加记录路径

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包问题加记录路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這題我用dfs做的想著dp做可是記錄路徑要字典序最小有點麻煩,所以向下面博客學習了。 ?11人閱讀?評論(0)?收藏?舉報 ?分類: ?

L3-001. 湊零錢

時間限制 200 ms
內存限制 65536 kB
代碼長度限制 8000 B
判題程序 Standard 作者 陳越

韓梅梅喜歡滿宇宙到處逛街。現在她逛到了一家火星店里,發現這家店有個特別的規矩:你可以用任何星球的硬幣付錢,但是絕不找零,當然也不能欠債。韓梅梅手邊有104枚來自各個星球的硬幣,需要請你幫她盤算一下,是否可能精確湊出要付的款額。

輸入格式:

輸入第一行給出兩個正整數:N(<=104)是硬幣的總個數,M(<=102)是韓梅梅要付的款額。第二行給出N枚硬幣的正整數面值。數字間以空格分隔。

輸出格式:

在一行中輸出硬幣的面值 V1?<= V2?<= ... <= Vk,滿足條件 V1?+ V2?+ ... + Vk?= M。數字間以1個空格分隔,行首尾不得有多余空格。若解不唯一,則輸出最小序列。若無解,則輸出“No Solution”。

注:我們說序列{A[1], A[2], ...}比{B[1], B[2], ...}“小”,是指存在 k >= 1 使得 A[i]=B[i] 對所有 i < k 成立,并且 A[k] < B[k]。

輸入樣例1:
8 9
5 9 8 7 2 3 4 1
輸出樣例1:
1 3 5
輸入樣例2:
4 8
7 2 4 3
輸出樣例2:

No Solution

思路:

很好的一個題,這個題是一個01背包的滿包問題。

所謂滿包我的理解就是說 ?對于我們以前所做的基礎的01背包就是給定你最大的容量M,給你一堆物品的體積,和每個物品對應的價值,讓你去尋找所能裝的 最大的價值. 這里的最大價值 就是說我的背包實際裝的物品的容量可以等于M 則此時為裝滿狀態,也可以小于M去獲得最大的價值.而這里,我們必須要湊出金額為M才能滿足題意,此時我們就理解為是01背包的滿包問題.

那么對于滿包問題的處理就是要排除那些不可能出現的狀態,即把所有初始狀態都賦值為-inf.然后在背包

那么對于這個題,我們可以把所給硬幣的價錢看為他們的體積,每個硬幣的價值都看為1,背包的總容量為M,我們也必須要裝滿背包.

之所以把硬幣的價錢看為體積,是因為我們要湊出M錢,M也是錢數.

把每個硬幣的價值看為,是一個很巧妙的思想,因為這里他要我們求出最小的順序,那么對于同樣的體積M,我用的硬幣越多是不是也就會使硬幣的序列越小,而且要對所有的硬幣排序,這樣就會使某個硬幣的價錢越大,那么他前面硬幣的價錢越小,也會使序列變小.

路徑的記錄:

pre[]記錄當前總價錢的上一個價錢的是多少,ans[]對應本價錢時所對應的硬幣的價值.然后遞歸打印

[cpp]?view plaincopy
  1. #include<bits/stdc++.h>??
  2. #define?inf?0x3f3f3f3f??
  3. using?namespace?std;??
  4. typedef?long?long?ll;??
  5. const?int?maxn=1e4+10;??
  6. int?dp[111],ans[maxn],a[maxn],pre[maxn];???
  7. void?print(int?u){????
  8. ????if(!pre[u]){????
  9. ????????printf("%d",ans[u]);return?;????
  10. ????}????
  11. ????print(pre[u]);????
  12. ????printf("?%d",ans[u]);????
  13. }????
  14. int?main()??
  15. {??
  16. ??int?n,m;??
  17. ??scanf("%d?%d",&n,&m);??
  18. ??for(int?i=1;i<=n;i++)??
  19. ??scanf("%d",&a[i]);??
  20. ??memset(dp,-inf,sizeof(dp));??
  21. ??memset(pre,-1,sizeof(pre));??
  22. ??dp[0]=0;??
  23. ??sort(a+1,a+n+1);??
  24. ??for(int?i=1;i<=n;i++)??
  25. ??{??
  26. ????for(int?j=m;j>=a[i];j--)??
  27. ????{??
  28. ??????if(dp[j]<=dp[j-a[i]]+1)??
  29. ??????{??
  30. ????????dp[j]=dp[j-a[i]]+1;??
  31. ????????ans[j]=a[i];??
  32. ????????pre[j]=j-a[i];??
  33. ??????}??
  34. ????}??
  35. ??}??
  36. ??//cout<<dp[m]<<endl;???
  37. ??if(dp[m]>0)??
  38. ??{??
  39. ????print(m);??
  40. ??}??
  41. ??else??
  42. ??cout<<"No?Solution"<<endl;??
  43. ???return?0;??
  44. }?

總結

以上是生活随笔為你收集整理的背包问题加记录路径的全部內容,希望文章能夠幫你解決所遇到的問題。

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