poj2923(状态压缩dp)

来源:互联网 发布:淘宝无锡电动车怎么样 编辑:程序博客网 时间:2024/06/01 20:39

链接:点击打开链接

题意:有n个货物,给出每个货物的重量,每次用容量为c1,c2的火车运输,问最少需要运送多少次可以将货物运完

代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int n,c1,c2;int w[15],v[105],dp[(1<<10)+5],tmp[(1<<10)+5];int judge(int s){    int i,j,sum;    sum=0;    memset(v,0,sizeof(v));    v[0]=1;    for(i=0;i<n;i++)    if((1<<i)&s){    sum+=w[i];    if(sum>c1+c2)    return 0;    for(j=c1;j>=w[i];j--)    if(v[j-w[i]])    v[j]=1;    }    for(i=0;i<=c1;i++)    if(v[i]&&sum-i<=c2)    return 1;    return 0;}int main(){    int t,i,j,k,cas;    cas=1;    scanf("%d",&t);    while(t--){        k=0;        scanf("%d%d%d",&n,&c1,&c2);        for(i=0;i<n;i++)        scanf("%d",&w[i]);        for(i=1;i<(1<<n);i++)        if(judge(i))                            //判断每个状态的体积能不能一次运走        tmp[k++]=i;        memset(dp,INF,sizeof(dp));        dp[0]=0;        for(i=0;i<k;i++)        for(j=(1<<n)-1;j>=0;j--){               //以每个状态为体积,价值为1,进行01背包            if(tmp[i]&j)            continue;            if(dp[j]!=INF)            dp[j|tmp[i]]=min(dp[j|tmp[i]],dp[j]+1);        }        printf("Scenario #%d:\n%d\n\n",cas++,dp[(1<<n)-1]);    }    return 0;}

0 0
原创粉丝点击