飯卡

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 16695    Accepted Submission(s): 5809


Problem Description
電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買一個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功(即使購買後卡上餘額爲負),否則無法購買(即使金額足夠)。所以大家都希望儘量使卡上的餘額最少。
某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜的價格以及卡上的餘額,問最少可使卡上的餘額爲多少。
 

Input
多組數據。對於每組數據:
第一行爲正整數n,表示菜的數量。n<=1000。
第二行包括n個正整數,表示每種菜的價格。價格不超過50。
第三行包括一個正整數m,表示卡上的餘額。m<=1000。

n=0表示數據結束。
 

Output
對於每組輸入,輸出一行,包含一個整數,表示卡上可能的最小余額。
 

Sample Input
1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
 

Sample Output
-45 32
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int x[1000],s[10010];
int main()
{
	int n;
	while(scanf("%d",&n),n)
	{
		memset(s,0,sizeof(s));
		for(int i=0;i<n;i++)
		scanf("%d",&x[i]);
		sort(x,x+n);
		int sum;
		scanf("%d",&sum);
		int tmmd=sum-5;
		if(tmmd<0)
		{
			printf("%d\n",sum);
			continue;
		}
		for(int i=0;i<n-1;i++)
		{
			for(int j=tmmd;j>=0;j--)
			{
			   if(j>=x[i])//why,因爲x[i]代表第i行能放的最小數值,再小就放不下,不滿足條件。
			    {
				s[j]=max(s[j],s[j-x[i]]+x[i]);//爲什麼j-x[i],因爲 在第i行要想放入一個價值是x[i]的,必須在原來的基礎上加上x[i]才能保證能放入,因爲j是從最大開始的所以要減去x[i],保證能放下
			    }
			}
		}
		printf("%d\n",sum-s[tmmd]-x[n-1]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章