13-14寒假作业15

poj 3624

完完全全就是一个01背包问题!!!

具体01背包网上到处讲解,不再赘述。

由于01背包在计算过程中只需要用到两行,当前计算行和上一行,所以dp数组可以这么开:dp[2][maxn]。还有就是用cin〉〉会超时。

 

#include<cstdio>
#include<cstring>

int a[13000],N,M,w[3500],d[3500],dp[2][13000];
int max(int a,int b)
{
    return a>=b?a:b;
}
int main()
{
    int i,j;
    memset(a,0,sizeof(a));
    memset(w,0,sizeof(w));
    memset(d,0,sizeof(d));
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&N,&M);
    for(i=0;i<N;++i)
    {
        scanf("%d%d",&w[i],&d[i]);
    }
    for(j=0;j<=M;++j)
        if(j>=w[0]) dp[0][j]=d[0];
    for(i=1;i<N;++i)
    {
        for(j=0;j<=M;++j)
        {
            if(j>=w[i])
                dp[i%2][j]=max(dp[(i+1)%2][j],dp[(i+1)%2][j-w[i]]+d[i]);
            else
                dp[i%2][j]=dp[(i+1)%2][j];
        }
    }
    int ans=0;
    for(j=0;j<=M;++j)
        if(dp[(i+1)%2][j]>ans) {ans=dp[(i+1)%2][j]; }
    printf("%d\n",ans);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值