题目意思是俩量车去搬家,俩量车都有最大的容量限制,问最小的搬运次数。。。。
状态里面0表示还没有运走,1表示已经运走。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int c1,c2,n;
int sum,num;
int q[13],dp[1028],w[1028];
void dfs(int sum1,int x,int y,int s){ //sum1是以决策的状态数,x是第一辆车所剩容积,y是第二量车所剩容积,s是已经放入的状态。。
if(sum1>=n){ //全部决策完就记录
if(dp[s]==0){ //判断是否重复记录
w[num++]=s;
dp[s]=1;
}
return ;
}
if(q[sum1] <= x) dfs(sum1+1,x-q[sum1],y,s|(1<<sum1)); //能否放入第一辆车。
if(q[sum1] <= y) dfs(sum1+1,x,y-q[sum1],s|(1<<sum1)); //能否放入第二量车。
dfs(sum1+1,x,y,s); //俩量车都不放。
}
int main(){
int t,i,j,count;
scanf("%d",&t);
count=t;
while(t--){
scanf("%d%d%d",&n,&c1,&c2);
for(i=0;i<n;i++) scanf("%d",&q[i]);
int ant=1<<n;
memset(dp,0,sizeof(dp));
num=0;
dfs(0,c1,c2,0);
for(i=0;i<ant;i++) dp[i]=99999999;
dp[0]=0;
for(i=0;i<ant;i++){ //一次搜索覆盖。。。
for(j=0;j < num;j++){
if((i & w[j] ) == 0){ //记得这里 & 的优先级最高,所以必须有括号。。。
dp[i|w[j]]=min(dp[i|w[j]],dp[i]+1);
}
}
}
printf("Scenario #%d:\n",count-t);
printf("%d\n\n",dp[ant-1]);
}
return 0;
}
路途。。。。。