dp训练第26题 vijos1071 新年趣事之打牌 01背包,满包,方案

给定背包体积v(总重减去v),物品数n(100),每个物品的重量(1000)
求是否能恰好装满背包
如果不能,输出0
如果有多解,输出-1
否则输出解的方案

一道满包输出方案题
需要注意的地方有很多
1.统计方案数时初始dp[0][0]一定要设为-1
2.每次转移时j从0开始转移,目的是把j为0的状态转移过来(此条针对二维数组)
3.尤其是!不要秀!踏踏实实写代码!多写一行有什么大不了的!是要可读性!是要效率!而不是秀!

    int v=-read(),n=read();
    for(int i=n;i>=1;i--)
        v+=(save[i]=read());

    dp[0][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=v;j++)
        {
            dp[i][j]+=dp[i-1][j];
            if(j>=save[i])
                dp[i][j]+=dp[i-1][j-save[i]];
        }

    if(dp[n][v]==0) printf("%d\n",0 );
    else if(dp[n][v]>1) printf("%d\n",-1 );
    else
        for(int i=n,j=v;i>=1;i--)
        {
            if(dp[i-1][j-save[i]])
            {
                printf("%d ",n+1-i );
                j-=save[i];
            }
        }

把vijos难度7以上的背包题都做一下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值