01背包题
注意留出五块钱减去最贵的商品即可
#include "iostream" #include <stdio.h> #include <algorithm> #include <queue> #include "string.h" #include "math.h" using namespace std; int cmp(int a,int b) { return a<b; } int main() { int n,money; int dp[1005]; int ss[1005]; while(scanf("%d",&n)&&n) { memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) scanf("%d",&ss[i]); scanf("%d",&money); if(money<5) {printf("%d\n",money);continue;} sort(ss+1,ss+n+1,cmp); for(int i=1;i<=n-1;i++) for(int j=money-5;j>=ss[i];j--) dp[j]=max(dp[j],dp[j-ss[i]]+ss[i]); printf("%d\n",money-ss[n]-dp[money-5]); } return 0; }