题目大意:
给你n个物品,还有俩辆车的容量,问最少几次可以把物品运完;
解题思路:
运用状态压缩的思想,枚举所有可能的方案,将满足条件的方案放在一个数组中,当做一个有体积的物品;
然后再对上面的物品进行0-1背包的递推;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn (1<<10)
#define INF 0x3f3f3f3f
int n,c1,c2,len;
int cost[11];
int val[11];
int sta[maxn+10];
void solve()
{
len=0;
for(int i=0;i<(1<<n);i++)
{
int k=0;
for(int j=0;j<n;j++)
{
if((1<<j)&i)
val[k++]=cost[j];
}
int flag=0;
for(int j=0;j<(1<<k);j++)
{
int t1=c1,t2=c2;
for(int t=0;t<k;t++)
{
if(j&(1<<t))
t1-=val[t];
else
t2-=val[t];
if(t1<0||t2<0)
break;
}
if(t1>=0&&t2>=0)
{
flag=1;
break;
}
}
if(flag) sta[len++]=i;
}
}
void dp_01()
{
int dp[maxn+10]={0};
for(int i=0;i<(1<<n);i++) dp[i]=INF;
dp[0]=0;
for(int i=0;i<len;i++)
{
for(int j=((1<<n)-1);j>=0;j--)
{
dp[j|sta[i]]=min(dp[j|sta[i]],dp[j]+1);
}
}
printf("%d\n\n",dp[(1<<n)-1]);
}
int main()
{
int t;
scanf("%d",&t);
int tt=1;
while(t--)
{
printf("Scenario #%d:\n",tt++);
scanf("%d%d%d",&n,&c1,&c2);
for(int i=0;i<n;i++)
scanf("%d",&cost[i]);
solve();
dp_01();
}
}