您的位置:首页 > 其它

soj3172Fisherman_01背包装满

2017-08-16 15:48 106 查看
简述题意:一个人卖鱼,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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  背包 soj