贪心算法,思路见代码
本来想搜索,结果有O(1)的算法,我佛了
其实每一种6x6的方案可以打表预处理,然后dp or search
但是既然可以贪心何乐而不为呢?
1 #include <set> 2 #include <map> 3 #include <cmath> 4 #include <queue> 5 #include <vector> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 using namespace std; 12 /* 13 //体积为4,5,6的有一个就需要一个箱子,体积为3的需要(c+3)/4个箱子 14 //剩余的空间我们采取贪心的策略,先放2x2的箱子,4x4的箱子还剩下boxD*5个2x2的空间 15 //对于3x3底面积的需要分情况讨论 16 //3x3的箱子装完了还剩下3个,留下了1个2x2的空间 17 //3x3的箱子装完了还剩下2个,留下了3个2x2的空间 18 //3x3的箱子装完了还剩下2个,留下了5个2x2的空间 19 //解决了2x2的空间还剩下1x1的,总体积减去所有其他箱子的体积,就剩下1x1的空间了。 20 */ 21 int main() { 22 for(int a,b,c,d,e,f,ans; scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)&&(a+b+c+d+e+f);) { 23 ans=(c+3)/4+d+e+f; 24 int left2x2=d*5; 25 if(c%4==1)left2x2+=5; 26 else if(c%4==2)left2x2+=3; 27 else if(c%4==3)left2x2++; 28 if(b>left2x2)ans+=((b-left2x2)+8)/9; 29 int left1x1=36*ans-4*b-9*c-16*d-25*e-36*f; 30 if(a>left1x1)ans+=((a-left1x1)+35)/36; 31 cout<<ans<<endl; 32 } 33 return 0; 34 }