01揹包,飯卡問題

題目:

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<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
main()
{
	int f[1010];
	int i;
	int m[1010],w[1010];
	int t;
	int n,V,v;
	int sum;
	
    while(scanf("%d",&n)&&n!=0)
	{
		memset(f,0,sizeof(f));
		
		
		for(i=0;i<n;i++)
		{
			scanf("%d",&w[i]);
			m[i]=w[i];
		}
		scanf("%d",&V);
		
		sort(m,m+n);
		sort(w,w+n);
	
		for(i=0;i<n-1;i++)
		{
			for(v=V-5;v>=m[i];v--)
			{
				if(f[v]<f[v-m[i]]+w[i])
				f[v]=f[v-m[i]]+w[i];
			}
		}
		sum=V-f[V-5];
		sum=sum-m[n-1];
		if(V<5)
		{
			sum=V;
		}
		printf("%d\n",sum);
	}
} 





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