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[MAX]=INF,极大值,就代表不存在这种重量组合,i从1~n看每条鱼,再j从fish[i]到sum总重,相当于分析了所有包含
这条鱼的情况,只要存在就比f[j]=INF不存在时候小,所以存在j重量组合,即f[j]有值。
最后只要判断那些重量存在就行了:
背包装满就看存在不存在就好了。
哦对了,针对本题莫名其妙WA哇哇的人,本题中有这样一句话
大体意思还是和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.
相关文章推荐
- hdu 2602 * 01背包 一维数组 不限装满
- hdu 2670 Girl Love Value(刚好装满的01背包)
- 背包问题---01背包|完全背包(装满背包的方案总数分析及实现)
- 01背包”及“完全背包”装满背包的方案总数分析及实现
- 背包问题---01背包|完全背包(装满背包的方案总数分析及实现)
- 01背包及其变种(物品无限背包、恰好装满背包)
- 装满01背包问题和01背包问题
- 分辣条-01背包恰好装满情况
- 01背包(要求恰好装满)
- 背包问题——“01背包”及“完全背包”装满背包的方案总数分析及实现
- 【POJ-3624】Charm Bracelet (01背包)
- uva624 - CD(01背包+打印路径)
- codevs 1115 开心的金明--01背包
- CodeForces 366C-Dima and Salad【01背包】
- 杭电1203I NEED A OFFER!(01背包)
- 算法_动态规划_01背包问题(重量为浮点型)
- 01背包问题
- hdu 1203(01背包)被初始化坑惨了
- [HDOJ1171]Big Event in HDU(01背包)
- 【杭电oj】1203 - I NEED A OFFER!(01背包)