比较模板的题。。。但是有坑
我们求出m -5的预算下能达到的最大消费金额,然后再用剩下的钱去购买最贵的菜,这样得到的结果是最小的。。。
当m < 5 时 直接输出结果。。这也比较坑。。
#include <bits/stdc++.h>
using namespace std;
int dp[1010],p[1010],m,n;
const int INF = 0x7f7f7f;
int main()
{
while(cin >> n and n)
{
fill(dp, dp + 1010, 0);
for(int i = 1; i <= n; i++) scanf("%d",&p[i]);
scanf("%d", &m);
if(m < 5)
{
cout << m << endl;
continue;
}
sort(p + 1, p + 1 + n);
for(int i = 1; i <= n - 1; i++)
{
for(int j = m - 5; j >= p[i]; j--)
{
//if(dp[j] >= 5) dp[i] = min(dp[j] - p[i], dp[i]);
//else dp[i] = min(dp[j], dp[i]);
dp[j] = max(dp[j - p[i]] + p[i], dp[j]);
}
}
cout << m - p[n] - dp[m - 5]/*dp[n]*/ << endl;
}
return 0;
}