hdu3033 I love sneakers! 分组背包变形
分组背包要求每一组里面只能选一个,这个题目要求每一组里面至少选一个物品。
dp[i, j] 表示前 i 组里面在每组至少放进一个物品的情况下,当花费 j 的时候,所得到的的最大价值。这个状态可以由三个状态转移过来:
- dp[i-1, v-a[i,j].b] 表示第 i 组没有放过,将要放进第 i 组里面的第 j 个物品
- dp[i, v-a[i,j].b] 表示第 i 组已经放过了,将要放进第 i 组里面的第 j 个物品
- 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! 分组背包变形的更多相关文章
- hdu3033 I love sneakers! 分组背包变形(详解)
这个题很怪,一开始没仔细读题,写了个简单的分组背包交上去,果不其然WA. 题目分析: 分组背包问题是这样描述的:有K组物品,每组 i 个,费用分别为Ci ,价值为Vi,每组物品是互斥的,只能取一个或者 ...
- 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 ...
- I love sneakers!(分组背包HDU3033)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 3033 分组背包变形(每种至少一个)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3033 I love sneakers! 分组背包
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3033 I love sneakers!(分组背包+每组至少选一个)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU3033I love sneakers!(分组背包)
http://acm.hdu.edu.cn/showproblem.php?pid=3033 本题的意思就是说现在有n种牌子的鞋子,每种品牌有一些不同的鞋,每双鞋子都有一个特定的权值,现在要求每种品牌 ...
- HD3033I love sneakers!(分组背包+不懂)
I love sneakers! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu3033I love sneakers! (分组背包,错了很多次)
Problem Description After months of hard working, Iserlohn finally wins awesome amount of scholarshi ...
随机推荐
- ECMAScript 6新特性(1)数组篇
数组现有的方法: .concat():连接两个或更多的数组,并返回结果. .join():把数组的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. .pop():删除并返回数组的最后一个元素 . ...
- linux下一键安装 powershell,的bash脚本
说明 目前,linux下的powershell约等于pash.希望大家专注mono,关注pash. 一键安装脚本包括for centos6,centos7,ubuntu 14.04 ubuntu 1 ...
- hashmap and hashtable
①继承不同. public class Hashtable extends Dictionary implements Map public class HashMap extends Abstrac ...
- 关于Mapper、Reducer的个人总结(转)
Mapper的处理过程: 1.1. InputFormat 产生 InputSplit,并且调用RecordReader将这些逻辑单元(InputSplit)转化为map task的输入.其中Inpu ...
- JS教程:词法作用域和闭包 (网络资源)
varclassA = function(){ ; } classA.prototype.func1 = function(){ var that = this, ; function a(){ re ...
- oracle 备份和还原还有创建用户、表空间、授权
--找到存放dbf文件的路径--E:\oracle\product\10.2.0\oradata\orcl--可以通过此语句进行查询select * from v$datafile; --创建表空间c ...
- (转)深入理解javascript的function
原文:http://www.cnblogs.com/sharpxiajun/archive/2011/09/16/2179323.html javascript笔记:深入理解javascript的fu ...
- 2016-1-9 Quartz框架的学习,剪裁图片并设置边框
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- 2016 - 1 - 3 国旗选择demo
// // ViewController.m // 国旗 // // Created by Mac on 16/1/3. // Copyright © 2016年 Mac. All rights re ...
- Java 集合源码解析(1):Iterator
Java, Android 开发也有段时间了,当初为了早点学 Android,Java 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...