1. 程式人生 > >HDU 2546飯卡

HDU 2546飯卡

AI turn title sin 最小 test desc include 整數

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

Source UESTC 6th Programming Contest Online

Recommend lcy 分析的思路就不說了,好多博客都有了,這裏註意的就是不需要用f1,f2去標記終點什麽的的,什麽題其實都不太需要的...吧? 入門的水題...然而...wa了好久QAQ就是渣渣
#include<iostream>
#include
<cstring> #include<cmath> #include<algorithm> #include<iomanip> using namespace std; int dp[1200][1200]; int a[1200]; int main() { int n;//n個菜 int yue; int sum; int f1,f2; while(cin>>n&&n!=0) { sum=0; memset(a,0,sizeof(a)); memset(dp,
0,sizeof(dp)); for(int i=1;i<=n;i++) { cin>>a[i]; } cin>>yue; if(yue<5) cout<<yue<<endl; else { sort(a+1,a+n+1); sum=yue-5; for(int i=1;i<=n-1;i++) { for(int j=0;j<=sum;j++) { if(j>=a[i]) { dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i]]+a[i]); } else dp[i][j] = dp[i-1][j]; } } yue=yue-dp[n-1][sum]-a[n]; cout<<yue<<endl; } } return 0; }

HDU 2546飯卡