POJ 3093 Margaritas on the River Walk (0-1背包变形)
来源:互联网 发布:怎么销毁淘宝账号 编辑:程序博客网 时间:2024/04/28 11:31
这题目的思路很巧妙,什么情况下剩下的所有物品都放不下呢?就是当前剩余物品中最小的那个也放不下。所以,先把物品按照容量从小到大排序,依次枚举当前背包为放不下的最小物品的情况。
对于当前物品i,必有1到i-1的所有物品都放进去,这时候比i大的物品谁放谁不放是不确定的。转换成0-1背包问题:把前i-1个物品都放进去以后,得到空间为tsum - sum[i-1](前缀和)的包,只要从第i+1到第n个物品中拿出一个方案填充这个包使得剩余体积小于第i个物品的体积就可以了,把总方案数累加就是结果!
注意特殊情况:当排序后最小的物品也无法放入时,直接返回0,因为dp[0]初始化为1,
代码:
/*poj 3093232K0MS*/#include<cstdio>#include<algorithm>#include<iostream>#define MAXN 1005using namespace std;int n, m, wei[35], dp[MAXN], sum[MAXN];__int64 Bag(){memset(sum, 0, sizeof(sum));sort( wei + 1, wei + n + 1 );if(wei[1] > m)//因为很可能有最小的也放不下这种情况,而dp【0】是初始化为1的,会输出1 return 0;for(int i = 1;i <= n;i ++)sum[i] = sum[i-1] + wei[i];__int64 ans = 0;for(int i = 1;i <= n;i ++){if(sum[i - 1] > m)break;memset(dp, 0, sizeof(dp));dp[sum[i-1]] = 1;for(int j = i + 1;j <= n;j ++)for(int k = m; k >= sum[i - 1] + wei[j]; k --)dp[k] += dp[k - wei[j]];for(int j = m - wei[i] + 1;j <= m;j ++)ans += dp[j];}return ans;}int main(){int Cases;cin>>Cases;for(int cnt = 1; cnt <= Cases; cnt ++){cin >> n >> m;for(int i = 1;i <= n;i ++)cin>> wei[i];cout << cnt << " " << Bag() <<endl;}return 0;}
0 0
- POJ 3093 Margaritas on the River Walk (0-1背包变形)
- POJ 3093 Margaritas on the River Walk 0-1背包好题
- POJ 3093 Margaritas on the River Walk(背包)
- poj 3093 Margaritas on the River Walk(01背包统计)
- POJ 3093 Margaritas on the River Walk 背包DP
- POJ 3093 Margaritas on the River Walk
- POJ 3093 Margaritas on the River Walk
- POJ 3093 Margaritas on the River Walk
- POJ 3093Margaritas on the River Walk
- POJ - 3039 MARGARITAS ON THE RIVER WALK
- poj 3093 Margaritas on the River Walk //joj
- POJ 3093 Margaritas on the River Walk 笔记
- 【POJ3093】Margaritas on the River Walk【01背包变种】
- poj3093 Margaritas on the River Walk(特殊的01背包)
- pku3093 Margaritas on the River Walk
- pku 3039 Margaritas on the River Walk 背包dp 解题报告
- POJ3093 Margaritas on the River Wal ( 背包DP)
- poj 3093 Margaritas on the River…
- OpenGL在VS 2008平台下的配置过程
- [leetcode 10] Regular Expression Matching
- OC中对实例变量的相关处理方法——属性
- OCP 1Z0 053 99
- 黑色帽子
- POJ 3093 Margaritas on the River Walk (0-1背包变形)
- 程序员生存定律--成长路上常见的坑
- sublime text2 搭建scala开发环境(windows)
- 基础——运算分类
- git的安装和简单操作
- 大神倒计时
- UVa12478 - Hardest Problem Ever (枚举)
- UVA10066 - The Twin Towers
- NYOJ 484 The Famous Clock