你妹啊。。。。。。。到最后直接都在对拍了还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;
}