飯卡
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7572 Accepted Submission(s): 2582
Problem 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
import java.io.*;import java.util.*;public class Main {int M = 1005, n, m, k;int dp[] = new int[M];public static void main(String[] args) {new Main().work();}void work() {Scanner sc = new Scanner(new BufferedInputStream(System.in));while (sc.hasNext()) {n = sc.nextInt();if(n==0)System.exit(0);Node[] node = new Node[n];Arrays.fill(dp,0);for (int i = 0; i < n; i++) {node[i] = new Node();node[i].a = sc.nextInt();}m = sc.nextInt();if (m < 5)System.out.println(m);else {m=m-5;//預留出5元錢購買價格最大的菜Arrays.sort(node);//從小到大排序,用剩下的錢去購買剩下的菜for (int i = 0; i <n-1; i++) {for(int j=m;j>=0;j--){if(j>=node[i].a)dp[j]=Math.max(dp[j],dp[j-node[i].a]+node[i].a);//花掉的錢}}int last=5-node[n-1].a;//用預留出5元錢購買價格最大的菜System.out.println(m+last-dp[m]);}}}class Node implements Comparable<Node> {int a;public int compareTo(Node o) {return this.a > o.a ? 1 : -1;}}}