你妹啊。。。。。。。到最后直接都在对拍了还WA了好久,貌似大致我的坑在这里:循环的时候m值到了0(为毛不能。。。回去想一想),然后就是没有特判,当她一个都拿不到时,输出0(但是我以为对ans初始化为0时,可以省略这个特判,为毛。。),最后就是,,,这道题要求m个要全部取满,所以初始化的时候要分两步,一是负数,二是0。现在这里还不是很懂。
啊,还有,我看到说这个数会比2^31来的小,以为要用int64,为什么不需要呢。。。。。
好啦,以上是我的遗留问题,然后现在血槽为0,不想再看了。。。。
#include <stdio.h> #include <string.h> #define maxn 1010 #define inf 0x3f3f3f3f int dp[110][maxn],cost[maxn],val[maxn]; int n,m,l,ans; int max(int x,int y) { if(x>y) return x; else return y; } void solve() { int i,j,k; memset(dp,-1,sizeof(dp)); for(i=0;i<=l;i++) dp[0][i]=0; for(i=1;i<=n;i++) scanf("%d%d",&cost[i],&val[i]); for(i=1;i<=n;i++) for(j=m;j>=1;j--) for(k=l;k>=cost[i];k--) { if(dp[j-1][k-cost[i]]==-1) break; dp[j][k]=max(dp[j][k],dp[j-1][k-cost[i]]+val[i]); ans=max(ans,dp[j][k]); } // ans=0; // for(i=0;i<=l;i++) ans=max(ans,dp[m][i]); return ; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&l); solve(); ans=0; printf("%d\n",ans); } return 0; }