标签:main 状压 turn class tle nbsp put res code
给出 n 个物品,第 i 个物品有重量 w i 。现在有 m 个背包,第 i 个背包的限重为 c i ,求最少用几个背 包能装下所有的物品。
输入的第一行两个整数 n, m ( n ≤ 24 , m ≤ 100) 。
接下来一行 n 个整数,描述 w ( w i ≤ 10^8 ) 。
接下来一行 m 个整数,描述 c ( c i ≤ 10^8 ) 。
输出一行一个整数,描述最少需要使用的背包数。如果没有可行的方案来装下所有物品,请输出”NIE” (不含引号)。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<cstring> using namespace std; short dp[16777217];int use[16777217]; int wu[110],bao[110],n,m,inf; void cl(){ memset(wu,0,sizeof(wu)); memset(bao,0,sizeof(bao)); memset(dp,127,sizeof(dp)); memset(use,127,sizeof(use)); inf=use[0]; } bool comp(int x,int y){ if(x>y) return 1; return 0; } void dfs(int x){ if(dp[x]<n) return; int q=inf,p=inf; for(int now=1;now<=n;now++){ if(x&(1<<(now-1))){ int r=x-(1<<(now-1)); dfs(r); if(bao[dp[r]+1]-use[r]>=wu[now]) q=dp[r],p=use[r]+wu[now]; else if(bao[dp[r]+1]>=wu[now]&&bao[dp[r]+2]>=wu[now]) q=dp[r]+1,p=wu[now]; else continue; if(q<dp[x]) dp[x]=q,use[x]=p; else if(q==dp[x]&&p<use[x]) use[x]=p; } } } int main(){ cl(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&wu[i]); for(int i=1;i<=m;i++) scanf("%d",&bao[i]); sort(wu+1,wu+n+1,comp); sort(bao+1,bao+m+1,comp); if(bao[1]<wu[1]) {printf("NIE");return 0;} dp[0]=use[0]=0; dfs((1<<n)-1); if(dp[(1<<n)-1]>m) printf("NIE"); else printf("%d",dp[(1<<n)-1]+(use[(1<<n)-1]>0)); return 0; }
标签:main 状压 turn class tle nbsp put res code
原文地址:http://www.cnblogs.com/renjianshige/p/7198128.html