博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 3033 I love sneakers!(分组背包变型)
阅读量:4973 次
发布时间:2019-06-12

本文共 1896 字,大约阅读时间需要 6 分钟。

题意:

某人要买鞋,有k个品牌,每个品牌有j个款,每款都有标价和价值,要求已经M元内,每个品牌至少买一双鞋的最大价值和。

思路:

1. 要求每一组之中至少有一个被选中,和之前的最多有一个稍有区别,需要把题目再次细分。

2. dp[i][j] 表示选定 i 个品牌并且花费为 j 的最大价值,dp[i][j] 为正数表示状态存在,为负数表示状态不存在。

3. dp[i][j] = max(dp[i][j], dp[i][j - vk] + wk);      第 i 类品牌有选择并且要选择第 k 件物品。(不选择第 k 件物品是相等的,所以略过转移方程)

   dp[i][j] = max(dp[i][j], dp[i - 1][j - vk] + wk);  第 i 类品牌前面没有选择并且要选择第 k 件物品。

4. 由于状态是从 0 到 i 的且 dp[0][j] = 0,其他为 -INFS 。所以只有当第一类品牌的状态存在时,才能推导出来第二类品牌的存在状态,以此类推。

5. 题目中有 2 个陷阱,一是可能会存在某品牌数量为 0 的情况,另外会存在费用或价格为 0 的情况,所以状态转移方程不能调换。

 

#include 
#include
#include
using namespace std;const int MAXD = 10010;const int MAXN = 12;const int INFS = 0x3fffffff;vector
> brand[MAXN];int dp[MAXN][MAXD];int main(){ int n, m, k; while (scanf("%d %d %d", &n, &m, &k) != EOF) { for (int i = 1; i <= k; ++i) brand[i].clear(); for (int i = 0; i < n; ++i) { int id, w, v; scanf("%d %d %d", &id, &w, &v); brand[id].push_back(make_pair(w, v)); } memset(dp[0], 0, sizeof(dp[0])); int cflag = 0; for (int i = 1; i <= k; ++i) { for (int v = 0; v <= m; ++v) dp[i][v] = -INFS; if (!brand[i].empty()) ++cflag; for (int j = 0; j < brand[i].size(); ++j) { int w = brand[i][j].first; int val = brand[i][j].second; for (int v = m; v >= w; --v) { dp[i][v] = max(dp[i][v], dp[i][v - w] + val); dp[i][v] = max(dp[i][v], dp[i - 1][v - w] + val); } } } if (cflag == k && dp[k][m] > 0) printf("%d\n", dp[k][m]); else printf("Impossible\n"); } return 0;}

转载于:https://www.cnblogs.com/kedebug/archive/2013/02/18/2915089.html

你可能感兴趣的文章
Spring中使用Velocity模板
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
分布式锁的三种实现方式
查看>>
poj 2109 pow函数也能这么用?p的开n次方
查看>>
Oracle database link
查看>>
清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)
查看>>
POJ 1840 Eqs HASH
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
BZOJ 1833: [ZJOI2010]count 数字计数( dp )
查看>>
关于toString()和String()要说几句话
查看>>
bzoj 3751[NOIP2014]解方程
查看>>
CSS(二) 文字样式属性,背景和列表
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
面试题三 替换空格
查看>>