这道题主要是背包加点小脑洞,背包还是很基础也很好用的dp。
<span style="font-family:Microsoft YaHei;font-size:18px;">#include<bits/stdc++.h>
using namespace std;
int num[1005],dp[50005];
int main() {
int n;
while(scanf("%d",&n) != EOF && n) {
int sum = 0;
for(int i = 1; i <= n;i++) {
scanf("%d",&num[i]);
sum += num[i];
}
memset(dp,0,sizeof(dp));
int mi;
scanf("%d",&mi);
if(mi < 5) printf("%d\n",mi);
else if(sum <= mi-5)
printf("%d\n",mi-sum);
else {
int m = 0,k;
for(int i = 1;i <= n;i++)
if(m < num[i]) {
m = num[i];
k = i;
}
num[k] = 0;
for(int i = 1;i <= n;i++)
for(int j = mi-5;j >= num[i];j--)
dp[j] = max(dp[j],dp[j-num[i]]+num[i]);
printf("%d\n",mi-(dp[mi-5]+m));
}
}
}</span>
多刷题,努力,晚安~