給1*1到6*6的包各若干個,問需要多少個6*6的包才能放的下..
沒有多想,直接就開始寫了,雖然寫的有點繁瑣,但思路清晰,很快就寫完了..
貪心的思想,盡量先放大的..程式注釋比較詳細,直接看程式吧,
#include <cstdio>using namespace std;int main(){int a[7];while(scanf("%d%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6])){if(a[1]+a[2]+a[3]+a[4]+a[5]+a[6]==0)break;int res=0;while(a[6]-->0)res++;//6隻能放一個 while(a[5]-->0){//放一個5,剩下放1 res++;a[1]-=11;}while(a[4]-->0){//4佔1個,剩下放1和2 res++;if(a[2]>0){//還剩下2 a[2]-=5;if(a[2]<0){//a沒有放滿 a[1]+=a[2]*4;//沒有放滿2的地方放1,注意現在a[2]是負數 }}else{a[1]-=20;//沒2,只能放1了 } }int rem3=a[3]%4;//一個包放4個3,多出來的3res+=a[3]/4;//剩下不同個數的3分情況討論 if(rem3==1){res++;if(a[2]>0){//剩下的空間可以放5個2,7個1 a[2]-=5;a[1]-=7;if(a[2]<0){//沒2了,放1 a[1]+=a[2]*4;}}else{a[1]-=27;//全部放1 } }else if(rem3==2){res++;if(a[2]>0){//剩下的空間可以放3個2,6個1 a[2]-=3;a[1]-=6;if(a[2]<0){//沒2了,放1 a[1]+=a[2]*4;}}else{a[1]-=18;//全部放一 }}else if(rem3==3){res++;if(a[2]>0){//剩下的空間可以放1個2,5個1 a[2]-=1;a[1]-=5;}else{a[1]-=9;//全部放9; }}if(a[2]>0){//還剩2 res+=a[2]/9;if(a[2]%9!=0){res++;a[1]-=36-(a[2]%9)*4; } }if(a[1]>0){//還剩1 res+=a[1]/36;if(a[1]%36!=0)res++; }printf("%d\n",res); }return 0;}