zoukankan      html  css  js  c++  java
  • hdu3182 状态压缩水题

    题意是这种     给你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 ",k);
    }
    return 0;
    }

  • 相关阅读:
    查看ASM 使用率
    修改一行和修改全表的TX锁
    OCP-1Z0-053-V12.02-683题
    专栏成书亦可行也!——leo鉴书48
    Java用正则表达式判断是否为IP
    OCP-1Z0-053-V12.02-594题
    OCP-1Z0-053-V12.02-585题
    OCP-1Z0-053-V12.02-569题
    OCP-1Z0-053-V12.02-568题
    OCP-1Z0-053-V13.02-517题
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4085603.html
Copyright © 2011-2022 走看看