Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16695 Accepted Submission(s): 5809某天,食堂中有n種菜出售,每種菜可購買一次。已知每種菜的價格以及卡上的餘額,問最少可使卡上的餘額爲多少。
第一行爲正整數n,表示菜的數量。n<=1000。
第二行包括n個正整數,表示每種菜的價格。價格不超過50。
第三行包括一個正整數m,表示卡上的餘額。m<=1000。
n=0表示數據結束。
#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;
}