题目:http://acm.hdu.edu.cn/showproblem.php?pid=2546
import java.util.Scanner;
public class Main {
public int max(int a,int b){
return a>b?a:b;
}
public int packet(int n,int price[],int money,int exp){
int f[]=new int[1024];
for(int i=0;i<n;i++){
f[0]=0;
}
for(int i=0;i<n;i++)
if(i!=exp) //最贵的菜留到最后买
for(int j=money;j>=price[i];j--){
f[j]=max(f[j],f[j-price[i]]+price[i]);
}
return money-f[money];
}
public static void main(String[] args) {
Main m=new Main();
Scanner sc=new Scanner(System.in);
int n; //菜的数量
int money; //余额
int price[]=new int[1024]; //菜的价格
while(sc.hasNext()){
int max=0; //记录最贵的菜
int exp=0; //记录最贵的菜的下标
n=sc.nextInt();
if(n==0)
break;
for(int i=0;i<n;i++){
price[i]=sc.nextInt();
if(max<price[i]){
max=price[i];
exp=i;
}
}
money=sc.nextInt();
if(money>=5){
System.out.println(m.packet(n,price,money-5,exp)+5-max); //买最贵的菜后的余额
}
else{
System.out.println(money);
}
}
}
}