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

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

飯卡-背包問題

2019-11-11 04:30:51
字體:
來源:轉載
供稿:網友

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 竹山县| 东乡| 武义县| 清丰县| 册亨县| 阳江市| 河源市| 抚宁县| 靖西县| 宁城县| 兴和县| 博罗县| 申扎县| 肃南| 美姑县| 芒康县| 枝江市| 阆中市| 蓬安县| 绥棱县| 磐石市| 高阳县| 两当县| 阜宁县| 黄龙县| 宁海县| 泸定县| 霍城县| 上栗县| 湖州市| 北票市| 菏泽市| 小金县| 威信县| 资中县| 富顺县| 东辽县| 江山市| 武定县| 德令哈市| 遂川县|