背包问题加记录路径
版權聲明:今日的我要超越昨日的我,明日的我要勝過今日的我, 以創作出更好的代碼為目標,不斷地超越自己。
L3-001. 湊零錢
時間限制 200 ms內存限制 65536 kB
代碼長度限制 8000 B
判題程序 Standard 作者 陳越
韓梅梅喜歡滿宇宙到處逛街?,F在她逛到了一家火星店里,發現這家店有個特別的規矩:你可以用任何星球的硬幣付錢,但是絕不找零,當然也不能欠債。韓梅梅手邊有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
- #include<bits/stdc++.h>??
- #define?inf?0x3f3f3f3f??
- using?namespace?std;??
- typedef?long?long?ll;??
- const?int?maxn=1e4+10;??
- int?dp[111],ans[maxn],a[maxn],pre[maxn];???
- void?print(int?u){????
- ????if(!pre[u]){????
- ????????printf("%d",ans[u]);return?;????
- ????}????
- ????print(pre[u]);????
- ????printf("?%d",ans[u]);????
- }????
- int?main()??
- {??
- ??int?n,m;??
- ??scanf("%d?%d",&n,&m);??
- ??for(int?i=1;i<=n;i++)??
- ??scanf("%d",&a[i]);??
- ??memset(dp,-inf,sizeof(dp));??
- ??memset(pre,-1,sizeof(pre));??
- ??dp[0]=0;??
- ??sort(a+1,a+n+1);??
- ??for(int?i=1;i<=n;i++)??
- ??{??
- ????for(int?j=m;j>=a[i];j--)??
- ????{??
- ??????if(dp[j]<=dp[j-a[i]]+1)??
- ??????{??
- ????????dp[j]=dp[j-a[i]]+1;??
- ????????ans[j]=a[i];??
- ????????pre[j]=j-a[i];??
- ??????}??
- ????}??
- ??}??
- ??//cout<<dp[m]<<endl;???
- ??if(dp[m]>0)??
- ??{??
- ????print(m);??
- ??}??
- ??else??
- ??cout<<"No?Solution"<<endl;??
- ???return?0;??
- }?
總結
- 上一篇: usaco Postal Vans(dp
- 下一篇: 上海欢乐谷买完票可以玩所有的吗