经典01背包问题,需要进行处理,因为可以为负数。
ac代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct p{
int price;
}a[1005];
bool cmp(p b , p c)
{
return b.price<c.price;//结构体进行排序
}
int dp[1005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
int P;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].price);
}
sort(a,a+n,cmp);
memset(dp,0,sizeof(dp));
scanf("%d",&P);
if(P<5)
{
printf("%d\n",P);
continue;
}
else
{
for(int i=0;i<n-1;i++)
{
for(int j=P-5;j>=a[i].price;j--)
{
dp[j]=max(dp[j],dp[j-a[i].price]+a[i].price);//记录全部金额无限接近5,剩下5块钱留下来买最大的物品
}
}
printf("%d\n",P-dp[P-5]-a[n-1].price);
}
}
return 0;
}