博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu3182 状态压缩水题
阅读量:5216 次
发布时间:2019-06-14

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

题意是这种     给你n个汉堡     每一个汉堡有它的价值   做每一个汉堡都得花费相应的能量      如今告诉你最大能量 让你求获得的最大的价值(有些汉堡必须有还有一些汉堡做好为前提)

   给你的n你最大为15

  

这道题的重点在于   每一个汉堡仅仅能做一次      跑遍所以的状态      mark记录每一个状态下所剩余的能量  dp数组记录每一个状态下的获得的最大的价值

#include<stdio.h>

#include<string.h>
#include<iostream>
using namespace std;
int value[20],cost[20],need[20][20],n,m;
int mark[1<<16],dp[1<<16];
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,i,j,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
for(i=1;i<=n;i++)
scanf("%d",&cost[i]);
memset(need,0,sizeof(need));
for(i=1;i<=n;i++)
{
scanf("%d",&need[i][0]);
for(j=1;j<=need[i][0];j++)
{
scanf("%d",&need[i][j]);
}
}
memset(mark,0,sizeof(mark));
for(i=0;i<(1<<n);i++)
      dp[i]=-10000000;
      dp[0]=0;
      mark[0]=m;
int flash,k=0,x;
for(i=0;i<=(1<<n)-1;i++)
{   
for(j=1;j<=n;j++)
{
x=(1<<(j-1));
if(i&x) continue;
int now=i|(1<<(j-1));
flash=0;
for(int t=1;t<=need[j][0];t++)
{
if(!(i&(1<<((need[j][t])-1)))) {flash=1;break;}
}
if(!flash&&dp[now]<dp[i]+value[j]&&mark[i]>=cost[j])
{
mark[now]=mark[i]-cost[j];
dp[now]=dp[i]+value[j];
k=Max(dp[now],k);
}
}
}
printf("%d\n",k);
}
return 0;
}

转载于:https://www.cnblogs.com/hrhguanli/p/4085603.html

你可能感兴趣的文章
【3】杭州思科电话面试
查看>>
资源文件的优点,在分模块式开发的大环境下,资源文件 几乎没有优势。。。小软件 有优势。...
查看>>
.net 调用小票打印机 打印票据
查看>>
Docker 第六章 存储卷
查看>>
教你一招:Microsoft Office Word已停止工作
查看>>
poj 2480 数论
查看>>
归并排序
查看>>
IOS应用发布NSLog的如何注释
查看>>
前端基础进阶(八):深入详解函数的柯里化
查看>>
jqGrid动态增加列,使用在根据条件筛选而出现不同的列的场景
查看>>
SQL事务与并发
查看>>
R语言 画图roc
查看>>
Python(数据库之约束表的关系)
查看>>
使用tcpdump抓取HTTP包
查看>>
栈的压入弹出序列
查看>>
JAVA学习2:Eclipse集成Maven
查看>>
Python基础学习-Python中最常见括号()、[]、{}的区别
查看>>
关闭Spring Boot的Jsckson的FAIL_ON_EMPTY_BEANS
查看>>
linux中的shell脚本编程---初识shell
查看>>
数组从文件中读取(接上问题)
查看>>