hdu(2546)(先拆分,再背包)
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int main() { int n,i,m,j,s[1500],dp[1500],flag,maxi; while(scanf("%d",&n),n) { maxi=-1; for (i=1;i<=n;++i) { scanf("%d",&s[i]); if (s[i]>maxi) { flag=i; maxi=s[i]; } } scanf("%d",&m); if (m<5) { printf ("%d\n",m); continue; } memset(dp,0,sizeof(dp)); for (i=1;i<=n;++i) for (j=m;j>=s[i];--j) { if (i!=flag) dp[j]=max(dp[j],dp[j-s[i]]+s[i]); } printf ("%d\n",(m-5-dp[m-5])+(5-maxi));//在前m-5中选择最大值,利用最后的5选择最大的,有点贪心的思想 } return 0; }