一個簡單的01揹包變種
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int N;
while(scanf("%d",&N))
{
if(N == 0)break;
int P[N],M;
for(int i = 0; i < N; i++)
scanf("%d",&P[i]);//N種菜的價格
sort(P,P+N);//排序 把價值最大的放在最後
int sum = 0;
for(int i = 0; i < N; i++)
sum += P[i];
scanf("%d",&M);
if(M < 5)
printf("%d\n",M);
else if(M - sum >= 5)
printf("%d\n", M - sum);
else
{
int dp[M];
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < N - 1 ;i++)//留下一個最大的
{
for(int p = M - 5;p >= P[i];p--)
dp[p] = max(dp[p],dp[p - P[i]]+P[i]);
}
printf("%d\n",M-dp[M-5]-P[N-1]);
}
}
return 0;
}