题目链接:https://vjudge.net/problem/POJ-1170

题意:输入n,表示有那种物品,接下来n行,每行a,b,c三个变量,a表示物品种类,b是物品数量,c代表物品的单价。接下来一个数字m,表示有m个套餐,接下来m行,每行一个数字k,表示有k对数字,后面接k对数字,分别是物品种类和物品数量,最后一个value代表这个套餐的价格(套餐价格一定比单独买这些东西的价格低)。现在要我们求出买上面所有东西所需要的最低价格。

分析数据会发现物品种类会超过5,每种物品数量不会超过5,所以可以用状态压缩,虽然我第一发是用完全背包加六个循环...

思路就是这样,具体看代码:

状压dp:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 50005
/*struct point{
int u,w; };
bool operator <(const point &s1,const point &s2)
{
if(s1.w!=s2.w)
return s1.w>s2.w;
else
return s1.u>s2.u;
}*/
map<int,int>mp;
int n,m,k,t,MAX;
int num[],value[],vis[maxn];//vis标记i这个数字是不是超出了物品最大数量
int bit[];
int dp[maxn];
struct node{
int state,value;//记录套餐的状态压缩的值和套餐价格
}item[];
int check(int a)//检查a这个数字是不是每一种物品数量都不超出数量限制
{
for(int i=;i<&&a;i++){
if(a%>num[i])
return false;
a/=;
}
return true;
}
int cal(int a)//计算状态压缩值a在不考虑套餐情况下需要的花费
{
int ans=;
for(int i=;i<&&a;i++){
ans+=(a%)*value[i];
a/=;
}
return ans;
}
void init()//把每一个状态在不考虑套餐是需要的花费1计算出来
{
memset(dp,,sizeof(dp));
for(int i=;i<=MAX;i++){
if(check(i))
{
vis[i]=;//表示i是可行的
dp[i]=cal(i);
}
}
}
int main()
{
bit[]=;
for(int i=;i<=;i++){
bit[i]=bit[i-]*;
}
while(scanf("%d",&n)!=EOF){
memset(num,,sizeof(num));
memset(vis,,sizeof(vis));
MAX=;
int id=,a,b,c;
mp.clear();
for(int i=;i<=n;i++){
scanf("%d%d%d",&a,&b,&c);
if(mp[a]==)
mp[a]=id++;//给物品编号
num[mp[a]]=b;
value[mp[a]]=c;
MAX+=b*bit[mp[a]];
}
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d",&k);
int state=;
for(int j=;j<=k;j++){
scanf("%d%d",&a,&b);
state+=b*bit[mp[a]];
}
item[i].state=state;
scanf("%d",&item[i].value);
}
init();
for(int i=;i<=m;i++){
for(int j=item[i].state;j<=MAX;j++){
if(vis[j]&&vis[j-item[i].state])//j和j-item[i].state都不超出限制
dp[j]=min(dp[j],dp[j-item[i].state]+item[i].value);
}
}
printf("%d\n",dp[MAX]);
}
return ;
}

六个循环的代码就不写了,傻乎乎啊。

poj 1170状压dp的更多相关文章

  1. POJ 3254 (状压DP) Corn Fields

    基础的状压DP,因为是将状态压缩到一个整数中,所以会涉及到很多比较巧妙的位运算. 我们可以先把输入中每行的01压缩成一个整数. 判断一个状态是否有相邻1: 如果 x & (x << ...

  2. POJ 3254 状压DP

    题目大意: 一个农民有一片n行m列 的农场   n和m 范围[1,12]  对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...

  3. POJ 2411 状压DP经典

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 16771   Accepted: 968 ...

  4. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  5. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  6. poj 2923 状压dp+01背包

    好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...

  7. Islands and Bridges(POJ 2288状压dp)

    题意:给你一个图和每个点的价值,边权值为连接两点权值的积,走哈密顿通路,若到达的点和上上个点相连则价值加三点乘积,求哈密顿通路的最大价值,和最大价值哈密顿通路的条数. 分析:开始看这个题很吓人,但想想 ...

  8. Hie with the Pie(POJ 3311状压dp)

    题意:披萨店给n个地方送披萨,已知各地方(包括披萨店)之间花费的时间,求送完所有地方并回到店花费的最小时间 分析:状态好确定dp[i][j],i中1表示地方已送过,否则为0,j为当前状态最后一个送过的 ...

  9. 炮兵阵地(POJ 1185状压dp)

    题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...

随机推荐

  1. View Stack容器,按钮选择子容器

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  2. java json字符串与对象转换

    下载引入包gson-2.0.jar 1.字符转数据 final Map map = new HashMap();map.put("contents",    "[{\&q ...

  3. 用U盘制作启动盘后空间变小的恢复方法

    先把u盘插好, 运行cmd(按住键盘左下角第二个windows键的同时按R), 输入diskpart,回车, (此时可以再输入list disk,回车,能看到这台电脑的所有磁盘大致情况,u盘一般是磁盘 ...

  4. 解决Java Web项目中Word、Excel等二进制文件编译后无法打开的问题

    今天写新项目的时候遇到一个问题,在resources目录下存储的.xlsx文件,编译过后会增大几kb,无法打开. Google了一番之后,发现问题源自于maven-resources-plugin这个 ...

  5. python 阿狸的进阶之路(8)

    异常处理 http://www.cnblogs.com/linhaifeng/articles/6232220.html(转) 网络编程socket http://www.cnblogs.com/li ...

  6. Xe7 System.Json解析数据格式

    一.Demo一 解析嵌套数组 Json数据 {"code":1,"msg":"","data":{"Grade ...

  7. css3 制作一个遮罩

    思路:1.显示两块图片,2.图片区域(初始隐藏),3.鼠标移入,遮罩显示,此时遮住图片,4.鼠标移出,遮罩恢复初始状态 用到两个css3 属性:transtion ,transform 用法: 1. ...

  8. 应用DBExportDoc导出mysql库为word07文档

    1.相关软件下载 DBExportDoc V1.0 For MySQL 密码:znu3 MySQL Connector/ODBC 2.安装mysql-connector-odbc并配置数据源 安装略. ...

  9. Android 操作UI线程的一些方法

    我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...

  10. 21 week4 submit buidAndRun() node-rest-client

    . 我们想实现一个提交代码的功能 这个功能有nodeserver 传到后边的server 验证 在返回给nodeserver 我们稍微修改一下ui ATOM修改文件权限不够 用下面命令 我们 Cont ...