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;}