简述题意:一个人卖鱼,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.