Uva Jin Ge Jin Qu
题实质:n个物品选k个 求总价值小于t的最大总价值
使用背包,队长点拨,忽然领悟,背包火候不够啊。。。。。。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=10007; const int JGJQ=678; int x[MAXN]; int sum[MAXN]; int dp[MAXN]; int ans,nans; int main() { int T,id=0; scanf("%d",&T); while(T--) { int n,t; scanf("%d%d",&n,&t); int i,j; for(i=1;i<=n;i++) { scanf("%d",x+i); } sort(x+1,x+n+1); ans=nans=sum[0] = 0; for(i=1;i<=n;i++) { sum[i] = sum[i-1] + x[i]; if(sum[i] < t) { nans = i; ans = sum[i]; } } if(nans != n) { memset(dp,-1,sizeof(dp)); dp[0] = 0; for(i=1;i<=n;i++) { for(j = t-1; j >= x[i]; j--) { if(dp[ j - x[i] ] >= 0) { dp[j] = max(dp[j] , dp[j-x[i]] + 1); } } } for(i=t-1;i>=0;i--) { if(dp[i] == nans) { ans = max(ans,i); break; } } } printf("Case %d: %d %d\n",++id,nans+1,ans+JGJQ); } return 0; }