poj 2923 Relocation 状态压缩01背包

来源:互联网 发布:坚持健身100 天 知乎 编辑:程序博客网 时间:2024/05/01 15:11
#include<stdio.h>#include<string.h>#define INF 1<<30int dp[1<<10];int w[20],n,a,b;int t[1<<10];int min(int a,int b){    return a>b?b:a;}int find(int r){    int i,j,val;    int vis[1<<10];    memset(vis,0,sizeof(vis));    vis[0]=1;    val=0;    for(i=0; i<n; i++)    {        if(1<<i&r)  //有        {            val+=w[i];            for(j=a; j>=w[i]; j--)            {                if(vis[j-w[i]])                    vis[j]=1;            }        }    }    if(val>a+b)        return 0;    for(i=0; i<=a; i++) //装满才是1,都能运走但不一定会装满    {        if(vis[i]&&val-i<=b)            return 1;    }    return 0;}int main(){    int i,j,k,l,ll,m;    scanf("%d",&ll);    for(l=1; l<=ll; l++)    {        scanf("%d %d %d",&n,&a,&b);        memset(t,0,sizeof(t));        memset(dp,0,sizeof(dp));        k=0;        for(i=0; i<n; i++)        {            scanf("%d",&w[i]);        }        for(i=1; i<(1<<n); i++)        {            if(find(i))            {                t[k++]=i;            }        }        for(i=0; i<(1<<n); i++)        {            dp[i]=INF;        }        dp[0]=0;        for(i=0; i<k; i++)        {            for(j=0; j<1<<n; j++)            {                if(dp[j]==INF)                    continue;                if((t[i]&j)==0)                {                    dp[ t[i]| j ]=min(dp[j]+1,dp[ t[i]|j ] );                    //  printf("zh=%d\n",dp[t[i]|j]);                }            }        }        printf("Scenario #%d:\n%d\n\n",l,dp[(1<<n)-1]);    }    return 0;}

原创粉丝点击