题意显而易见,不过一个细节看走眼奉献了1WA
【分析】
(1)初始余额m小于5,直接输出m
(2)初始余额大于5:
找出最贵的菜,与最末的元素交换位置
然后转化为01背包问题
选择令前n-1种菜之和最接近m-5,然后余额减去最大价值的菜即m - 选择的菜价格之和 - a[n-1]
m -= 5 ----- 背包容量
a[i] ----- 价值
a[i] ----- 重量
So easy~
#include <iostream>
#include <cstring>
using namespace std;
#define N 1005
int a[N],dp[N];
int Max(int x,int y)
{
return x > y ? x : y;
}
int main()
{
int n,m;
while(cin >> n)
{
if(n==0)
break;
int max = 0, max_id = -1;
for(int i=0; i<n; i++)
{
cin >> a[i];
if(max < a[i])
{
max = a[i];
max_id = i;
}
}
cin >> m;
if(m<5)
{
printf("%d\n",m);
continue;
}
m-=5;
int tmp;
tmp = a[max_id], a[max_id] = a[n-1], a[n-1] = tmp;
memset(dp,0,sizeof(dp));
for(int i=0; i<n-1; i++)
{
for(int j=m; j>=a[i]; j--)
{
dp[j] = Max(dp[j], dp[j-a[i]]+a[i]);
}
}
cout << (m + 5 - dp[m] - a[n-1]) << endl;
}
return 0;
}