饭卡 (背包01 一维数组) http://acm.hdu.edu.cn/showproblem.php?pid=2546
/*
从一组数据中选出n个数,使这n个数的和最接近一个值x,
背包问题,
从一系列菜中,从最贵的菜(MAX)之外中选出几个菜,使菜的总价格sum最接近money-5;money-sum-MAX;
钱数相当于背包总容量,菜相当于价值和体积一样物品;
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1050];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int Greens[n];
memset(dp,0,sizeof(dp));
memset(Greens,0,sizeof(Greens));
int max1=-0x3f3f3f3f;
for(int i=0; i<n; i++)
scanf("%d",&Greens[i]);
int money;
scanf("%d",&money);
if(money<5)
{
printf("%d\n",money);
continue;
}
sort(Greens,Greens+n);
for(int i=0;i<n-1;i++) //遍历每道菜
for(int j=money-5;j>=Greens[i];j--) //判断能不能买这种菜
dp[j]=max(dp[j],dp[j-Greens[i]]+Greens[i]);
int MAX=dp[money-5]; //最接近money-5的值
printf("%d\n",money-MAX-Greens[n-1]); //买过可以买的菜之后剩的钱数再买最贵的菜即可以使剩余钱数最少
}
return 0;
}