1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
-45 32
这道题是一道01背包问题,不过要稍微变下形,先用剩下的5元买最贵的东西,然后用m-5元买尽可能多的东西。
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; int f[1006],w[1006]; int main() { int n,m,i,j,maxx; while(scanf("%d",&n)!=EOF && n!=0) { for(i=1;i<=n;i++){ scanf("%d",&w[i]); } sort(w+1,w+1+n); maxx=w[n]; scanf("%d",&m); if(m<5){ printf("%d\n",m);continue; } if(m==5){ printf("%d\n",m-maxx);continue; } memset(f,0,sizeof(f)); for(i=1;i<=n-1;i++){ for(j=m-5;j>=w[i];j--){ f[j]=max(f[j],f[j-w[i]]+w[i]); } } printf("%d\n",m-maxx-f[m-5]); } return 0; }
原文:http://blog.csdn.net/kirito_acmer/article/details/46564799