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

首頁 > 學院 > 開發設計 > 正文

飯卡-背包問題

2019-11-11 05:09:53
字體:
來源:轉載
供稿:網友

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

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

Input

多組數據。對于每組數據: 第一行為正整數n,表示菜的數量。n<=1000。 第二行包括n個正整數,表示每種菜的價格。價格不超過50。 第三行包括一個正整數m,表示卡上的余額。m<=1000。 n=0表示數據結束。

Output

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

Sample Output
-4532

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

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

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;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文水县| 永泰县| 涟水县| 高安市| 沅陵县| 武汉市| 东莞市| 沙湾县| 萍乡市| 仁怀市| 汉阴县| 依安县| 肇东市| 辛集市| 建瓯市| 滨州市| 开封县| 莆田市| 永靖县| 和政县| 阜阳市| 宁蒗| 博湖县| 峨眉山市| 公主岭市| 邛崃市| 翁牛特旗| 宝丰县| 辽中县| 惠来县| 长沙市| 纳雍县| 伽师县| 汝城县| 临桂县| 固安县| 松滋市| 赤壁市| 府谷县| 克山县| 榆树市|