soj3172Fisherman_01背包装满

简述题意:一个人卖鱼,n条不同or相同重量的鱼(1~30条),重量在1~1000,问第一个挑选的人有多少种重量组合?

大体意思还是和2222差不多,因为可能有重复重量组合,比如2+4=1+5=3+3,但是这只算一种。所以还是可以用数组下标表示重量和,所有鱼加起来总重为sum,判断包含fish[i]的时候的重量和f[j]哪种最小(因为从sum一个一个减去,再除去fish[i]重量的组合也许不存在,所以还是包含fish[i]时候的重量最小,比如总重100,除去fish[i]=10之后余90重量可能组不到,就是INF)

所以还是可以通过f[j](仅仅表示包含了fish[i]时候的重量为j的 或 不包含fish[i]时候加上之后)

这道题主要看存在还是不存在某种重量组合,所以从所有重量之和sum,每次sum--,判断这种重量之和能不能现在存在,分析每一条鱼的各种组合情况即可。

重点代码如下:

	f[0] = 0;
        for(int i = 0;i < n;i++)
            for(int j = sum;j >= fish[i];j--)
                f[j] = min(f[j], f[j-fish[i]] + fish[i]);

初始赋值f[MAX]=INF,极大值,就代表不存在这种重量组合,i从1~n看每条鱼,再j从fish[i]到sum总重,相当于分析了所有包含

鱼的情况,只要存在就比f[j]=INF不存在时候小,所以存在j重量组合,即f[j]有值。

最后只要判断那些重量存在就行了:

	int num = 0;
        for(int i = 1; i <= sum; i++)
            if(f[i] != INF)  num++;
背包装满就看存在不存在就好了。


哦对了,针对本题莫名其妙WA哇哇的人,本题中有这样一句话

	There is a blank line before each test case.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值