现在的位置: 首页 > 综合 > 正文

HDU 3496

2017年11月21日 ⁄ 综合 ⁄ 共 861字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.