程序竞赛——背包问题

 

#include <stdio.h>
int main(void){
	int N,a,b,c,d,e,f,x,y;//其中y,x分别为装了其它的中能装2*2和1*1和数量 ,N为总箱子数量
	int u[4]={0,5,3,1};
	while(1){
		scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
		if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)break;
		N=f+e+d+(c+3)/4;
		y=5*d+u[c%4];
		if(b>y)N+=(b-y+8)/9;
		x=36*N-36*f-25*e-16*d-9*c-4*b;
		if(a>x)N+=(a-x+35)/36;
		printf("%d\n",N);
	} 
	return 0;
}
  • 说几点要点:
  • 首先这个包装问题是要节省打包的快递盒的总个数,所以统一用最大的的型号,然后再在里面装小的能装的型号,以此达到最节省
  • 然后我们明白,6*6的装了后3*3可以装2*2,1*1的,前面的也是可以,但不可以再装3*3
  • 所以明白这几点以后我们就需要明确大概思路,就是先把大的装了,然后再计算装了大的后还剩下的空余地方能装多少小的
  • 最后比较空余地方装了小的后是否还有没装的小的,若是有就再加。 

技巧 

  1. 在装了3*3的后剩余地方还能装几个2*2,由于未装满的6*6在其箱子中转的3*3的数目不同对应可装2*2不同,所以我们就用一个数组u来表示3*3的产品数目分别是4的倍数,4的倍数+1/+2/+3时,为3*3的产品打开的新箱子中剩余的2*2的空位个数。
  2. 小技巧:(c+3)/4正好等于c除以4向上取整的结果,这样就不用用if等复杂来区分不同情况了。
  3. 总结2,当需要向上取整时,(总数+(n-1))/n。如100个人(总数),每辆车坐3人(n),需要34辆车,33辆还有一个人没车,所以要+1,通过向上取整即让所加的小于等于n也就是+(n-1)达到目的,让多余的也有。
  4. 当输入特定数结束循环时,先用while(1),表示一直循环,直到到特定数break打破循环,避免死循环。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值