多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > POJ 3260 The Fewest Coins(多重背包+完全背包)

POJ 3260 The Fewest Coins(多重背包+完全背包)

來源:程序員人生   發(fā)布時間:2014-11-21 08:18:57 閱讀次數(shù):2703次

POJ 3260 The Fewest Coins(多重背包+完全背包)

http://poj.org/problem?id=3260

題意:

      John要去買價值為m的商品. 現(xiàn)在的貨幣系統(tǒng)有n種貨幣,對應(yīng)面值為val[1],val[2]…val[n]. 然后他身上每種貨幣有num[i]個. John必須付給售貨員>=m的金錢, 然后售貨員會用最少的貨幣數(shù)量找錢給John.

問你John的交易進(jìn)程中, 他給售貨員的貨幣數(shù)目+售貨員找錢給他的貨幣數(shù)目 的和最小值是多少?

分析:

       本題與POJ 1252類型:

       http://blog.csdn.net/u013480600/article/details/40454963

       假定John付款總額為S時的貨幣數(shù)目為T1, 售貨員找錢 (S-m) 的貨幣數(shù)目為T2. 我們要使得T1+T2最小, 那末自然T1和T2也必須各自是最小的(T1是當(dāng)John付款正好S,最少需要多少張貨幣. T2是當(dāng)售貨員正好找錢S-m,最少需要多少張貨幣.).

       John給的錢肯定>=m, 但是到底最大多大呢? 如果我們直接求John的所有金錢總和, 然后再DP, 肯定超時. 這個up_bound (john最多給售貨員的錢數(shù)) 可以簡單設(shè)置1個大數(shù)值便可. 網(wǎng)上有個證明(這個證明我也有點不明白):

       John的付款數(shù)最多為maxv*maxv+m

       證明以下:

       如果John的付款數(shù)大于了maxv*maxv+m,即付硬幣的數(shù)目大于了maxv,根據(jù)鴿笼原理,最少有兩個的和對maxv取模的值相等(這個意思應(yīng)當(dāng)是:最少maxv+1個硬幣對maxv求余,然后余數(shù)屬于[0,maxv⑴]范圍,肯定有最少兩個硬幣的余數(shù)相同的),也就是說,這部份硬幣能夠用更少的maxv來代替(這句話我不理解)。證畢。

 

       第1個問題是1個多重背包問題.

       令dp[i][j]==x 表示當(dāng)John用前i種貨幣組成j元錢時, 最少需要x張貨幣.

       初始化: dp全為INF(無窮大), 且dp[0][0]=0.

       對每種貨幣, 我們分情況對它進(jìn)行處理:

       1.    如果val[i]*num[i]>=up_bound時, 做1次完全背包.

       2.    如果val[i]*num[i]<up_bound時, 做屢次01背包.

       終究所求: dp[n][i] 其中i屬于[m, up_bound].

 

       第2個問題是1個完全背包問題.

       令dp2[i][j]==x 表示售貨員用前i種硬幣組成j元錢時, 最少需要x張貨幣.

       初始化: dp2全為INF(無窮大), 且dp2[0][0]=0.

       狀態(tài)轉(zhuǎn)移: dp2[i][j] = max( dp2[i⑴][j] , dp2[i][j-val[i]]+1 )

       終究所求: dp2[n][i] 其中i屬于[m, up_bound].

 

       終究合并問題1和問題2的解, 我們枚舉i從m到up_bound, 找出dp[i]+dp2[i-m]的最小值便可.

AC代碼:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF 1e9 int n;//n種硬幣 int m;//購買商品的價值 int up_bound;//DP價值上界 int val[100+5];//每種硬幣價值 int num[100+5];//每種硬幣數(shù)目 int dp[55555]; //多重背包 int dp2[55555];//完全背包 //1次01背包 void ZERO_ONE_PACK(int *dp,int cost,int sum) { for(int i=up_bound;i>=cost;i--) dp[i] = min(dp[i], dp[i-cost]+sum);//注意這里是+sum } //1次完全背包 void COMPLETE_PACK(int *dp,int cost) { for(int i=cost;i<=up_bound;i++) dp[i] = min(dp[i], dp[i-cost]+1); } //1次多重背包 void MULTIPLY_PACK(int *dp,int cost,int sum) { if(cost*sum>=up_bound) { COMPLETE_PACK(dp,cost); return ; } int k=1; while(k<sum) { ZERO_ONE_PACK(dp,cost*k,k); sum -=k; k *=2; } ZERO_ONE_PACK(dp,cost*sum,sum); } int main() { while(scanf("%d%d",&n,&m)==2) { //讀取輸入+計算上界 int max_val=0; for(int i=1;i<=n;i++) { scanf("%d",&val[i]); max_val= max(max_val,val[i]); } for(int i=1;i<=n;i++) scanf("%d",&num[i]); up_bound=max_val*max_val+m;//上界 //初始化dp和dp2 for(int i=1;i<=up_bound;i++) dp[i]=dp2[i]=INF; dp[0]=dp2[0]=0; //遞推進(jìn)程 for(int i=1;i<=n;i++) { MULTIPLY_PACK(dp,val[i],num[i]); COMPLETE_PACK(dp2,val[i]); } //統(tǒng)計結(jié)果 int ans=INF; for(int i=m;i<=up_bound;i++) ans= min(ans, dp[i]+dp2[i-m]); printf("%d ",ans==INF?⑴:ans); } return 0; }

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 最近的中文字幕免费完整 | 国产精品久久久久无码av | 午夜羞羞视频在线观看 | 视频一区二区国产无限在线观看 | 午夜三级网 | 中文字幕不卡一区 二区三区 | 手机看片福利永久 | 秋霞毛片| 免费一级欧美片在线观免看 | 最色影院 | 免费一区二区三区四区 | 欧美成人精品不卡视频在线观看 | 国产美女啪啪 | 视频一区二区三区在线 | 国产亚洲人成在线影院 | 免费一级欧美片片线观看 | 日本爱爱小视频 | 亚洲精品精品一区 | 中文字幕一区二区三区在线播放 | 欧美精品一区二区三区视频 | 欧美成人亚洲高清在线观看 | 日本无卡αv免费视频 | 午夜视频国语 | 在线亚州 | 国产啪视频1000部免费视频 | 亚洲欧美成aⅴ人在线观看 亚洲欧美成人 | 国产不卡在线视频 | 性欧美video另类hd | 欧美巨大video粗暴 | 一级看片免费视频 | freexxx性欧美极品另类 | 欧美16一17sex性hd | 羞羞视频动漫 | 日韩综合久久 | 欧美一级性视频 | 亚洲欧美日本韩国 | 2020国产成人免费视频 | 亚洲精品成人图区 | 一级特黄aa大片欧美网站 | 欧美日韩精品一区三区 | 亚洲精品国产福利一区二区三区 |