分组背包要求每一组里面只能选一个,这个题目要求每一组里面至少选一个物品。

dp[i, j] 表示前 i 组里面在每组至少放进一个物品的情况下,当花费 j 的时候,所得到的的最大价值。这个状态可以由三个状态转移过来:

  1. dp[i-1, v-a[i,j].b] 表示第 i 组没有放过,将要放进第 i 组里面的第 j 个物品
  2. dp[i, v-a[i,j].b] 表示第 i 组已经放过了,将要放进第 i 组里面的第 j 个物品
  3. dp[i, j] 表示第 i 中已经放过了,不放第 i 组里面的第 j 个物品

a[i, j].b表示第 i 组第 j 个物品的花费,v表示背包容量。

初始化:

如果一种物品都不放,那么对应的所有的背包容量都是0,也就是:dp[0, 0~M] = 0;

其他的情况,都初始化成-INF。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <queue>
#include <deque>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <vector>
#include <utility>
#include <functional>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <numeric>
#include <cassert>
#include <ctime>
#include <iterator>
const int INF = 0x3f3f3f3f;
const int dir[][] = {{-,},{,},{,-},{,},{-,-},{-,},{,-},{,}};
using namespace std;
typedef struct node
{
int b,v;
}node;
vector<node> a[];
int dp[][];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int n, V, k;
while (~scanf("%d%d%d",&n,&V,&k))
{
for (int i=;i<k;++i) a[i+].clear();
int id; node t;
for (int i=;i<n;++i)
{
scanf("%d",&id); scanf("%d%d",&t.b,&t.v); a[id].push_back(t);
}
bool flag=false;
for (int i=;i<k;++i) if(a[i+].size()==) {printf("Impossible\n"); flag=true; break; }
if(flag) {continue;}
memset(dp,-INF,sizeof(dp));
for (int i=;i<=V;++i) dp[][i]=;
for (int i=;i<=k;++i)
{
for (int j=;j<a[i].size();++j)
{
for (int v=V; v>=a[i][j].b;--v)
{
if(dp[i][v-a[i][j].b]!=-INF) dp[i][v]=max(dp[i][v],dp[i][v-a[i][j].b]+a[i][j].v);
if(dp[i-][v-a[i][j].b]!=INF) dp[i][v]=max(dp[i][v],dp[i-][v-a[i][j].b]+a[i][j].v);
}
}
}
if(dp[k][V]==-INF) printf("Impossible\n");
else printf("%d\n",dp[k][V]);
}
return ;
}

当然不是我自己想出来的……

参考:

http://www.cnblogs.com/zhourongqing/archive/2012/08/21/2649972.html

http://www.docin.com/p-374335925.html

http://www.cnblogs.com/nanke/archive/2011/11/24/2261695.html

hdu3033 I love sneakers! 分组背包变形的更多相关文章

  1. hdu3033 I love sneakers! 分组背包变形(详解)

    这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者 ...

  2. HDU3033 I love sneakers!———分组背包

    这题的动态转移方程真是妙啊,完美的解决了每一种衣服必须买一件的情况. if(a[x][i-c[x][j].x]!=-1) a[x][i]=max(a[x][i],a[x][i-c[x][j].x]+c ...

  3. I love sneakers!(分组背包HDU3033)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU 3033 分组背包变形(每种至少一个)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 3033 I love sneakers! 分组背包

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. hdu 3033 I love sneakers!(分组背包+每组至少选一个)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU3033I love sneakers!(分组背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=3033 本题的意思就是说现在有n种牌子的鞋子,每种品牌有一些不同的鞋,每双鞋子都有一个特定的权值,现在要求每种品牌 ...

  8. HD3033I love sneakers!(分组背包+不懂)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu3033I love sneakers! (分组背包,错了很多次)

    Problem Description After months of hard working, Iserlohn finally wins awesome amount of scholarshi ...

随机推荐

  1. html5+js实现刮刮卡效果

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: <!DOCTYPE html> <h ...

  2. 在其他页面调用 Discuz 7.2 BBS 论坛会员登录信息

    require_once './bbs/include/common.inc.php'; $discuz_uid 是用户ID $_DSESSION是用户所有信息

  3. 神奇的NOIP模拟赛 T1 LGTB 玩扫雷

    LGTB 玩扫雷 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 ...

  4. C语言:文件操作

    以附加方式打开文件,输入数据,关闭文件. #include<stdio.h> #include<stdlib.h> int main() { FILE *fp = NULL; ...

  5. LIS-Program E

    最大上升子序列 Description The world financial crisis is quite a subject. Some people are more relaxed whil ...

  6. OpenCV之响应鼠标(一):利用鼠标获取坐标

    好久没有更新博客了,今天临时起意,将以前写的示例代码整理了一下,暂且发布一篇,希望对大家有用! 代码一:点击时显示坐标,鼠标移动时不显示. #include <cv.h> #include ...

  7. hbase基本概念和hbase shell常用命令用法

    1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实 ...

  8. CSS 3D旋转 hover 后设置transform 是相对于正常位置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 华为V-ISA信誉安全体系:对付新型DDoS攻击的利器

        华为Anti-DDoS解决方案基于华为颇具传统优势的专业软硬件平台开发,在防护机制中,引入先进的检测机制,提供了业内首创的“V-ISA”信誉安全体系,是业界唯一单机可提供超百G DDoS防御能 ...

  10. org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors

    最近在项目中发现如下异常: 六月 25, 2015 5:58:34 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet ...