国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

飯卡-背包問(wèn)題

2019-11-11 04:02:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Description 電子科大本部食堂的飯卡有一種很詭異的設(shè)計(jì),即在購(gòu)買之前判斷余額。如果購(gòu)買一個(gè)商品之前,卡上的剩余金額大于或等于5元,就一定可以購(gòu)買成功(即使購(gòu)買后卡上余額為負(fù)),否則無(wú)法購(gòu)買(即使金額足夠)。所以大家都希望盡量使卡上的余額最少。 

某天,食堂中有n種菜出售,每種菜可購(gòu)買一次。已知每種菜的價(jià)格以及卡上的余額,問(wèn)最少可使卡上的余額為多少。 

Input

多組數(shù)據(jù)。對(duì)于每組數(shù)據(jù): 第一行為正整數(shù)n,表示菜的數(shù)量。n<=1000。 第二行包括n個(gè)正整數(shù),表示每種菜的價(jià)格。價(jià)格不超過(guò)50。 第三行包括一個(gè)正整數(shù)m,表示卡上的余額。m<=1000。 n=0表示數(shù)據(jù)結(jié)束。

Output

對(duì)于每組輸入,輸出一行,包含一個(gè)整數(shù),表示卡上可能的最小余額。Sample Input
1505101 2 3 2 1 1 2 3 2 1500

Sample Output
-4532

對(duì)數(shù)組進(jìn)行排序取出最大值(也可以直接選出最大的值),對(duì)剩下的n-1個(gè)數(shù)選出最接近m-5的組合,簡(jiǎn)化為一個(gè)大小為m-5的01背包問(wèn)題。

然后用m減去這個(gè)數(shù)和最大值,就可求出剩下最少的錢(最大負(fù)值)。

AC代碼:

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>using namespace std;int dp[1005],v[1005];int fun(int n,int m){    for(int i=0;i<n-1;i++)     {         for(int k=m-5;k>=v[i];k--)         {             dp[k]=max(dp[k],dp[k-v[i]]+v[i]);         }     }     return m-dp[m-5]-v[n-1];}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        if(n==0)break;        memset(dp,0,sizeof(dp));        for(int i=0;i<n;i++)            scanf("%d",&v[i]);        sort(v,v+n);        int m;        cin>>m;        if(m<5)cout<<m<<endl;        else            cout<<fun(n,m)<<endl;    }    return 0;}


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海阳市| 财经| 灯塔市| 合水县| 克什克腾旗| 皋兰县| 通辽市| 芒康县| 义乌市| 白水县| 乌什县| 梅河口市| 南川市| 外汇| 巴林左旗| 胶州市| 政和县| 万年县| 嘉兴市| 昌乐县| 正宁县| 黄浦区| 甘德县| 庆云县| 布尔津县| 海丰县| 娄烦县| 辉县市| 炉霍县| 马公市| 鄯善县| 鲜城| 崇义县| 平度市| 邢台市| 镇安县| 泗阳县| 元阳县| 罗城| 齐齐哈尔市| 太和县|