Time Limit: 3 second
Memory Limit: 2 MB
【问题描述】
将一根长为Xcm的钢管截成长为69cm和39cm两种规格的短料。在这两种规格的短料至少各截一根的前提下, 如何截才能余料最少。如果X<108CM,输出“error”。【输入】
一行,钢管的初始长度
【输出】
共三行。第一行是长为69CM的钢管数量,第二行是长为39CM的钢管数量,第三行为余料的长度。
【输入样例】
369【输出样例】
3 4 6
【题解】
只要无脑深搜就好,挺简单的,以当前使用的长度为search函数里的变量。不断尝试不同的长度即可。
【代码】
#include <cstdio> #include <stdlib.h> const int MAXN = 100; int c,rest,a[MAXN],minrest,a39,a69; //rest是当前实时更新的余料,minrest是最优解a39,a69是最优方案,实时的方案放在a[39]和a[69]; void input_data() { scanf("%d",&c); if (c < 108) //特判错误信息。 { printf("error"); exit(0); } rest = c - 108; //获取剩余的料 minrest = rest; a[39] = 1;a[69] = 1; //初始化最优解和实时解、 a39 = 1;a69 = 1; } void sear_ch(int t) //搜索长度为t的情况 { a[t]++; //t长度的使用根数++ rest-=t; if (rest < minrest) //尝试更新最优解 { minrest = rest; a39 = a[39];a69 = a[69]; } if (rest >= 69) //再继续搜 sear_ch(69); if (rest >=39) sear_ch(39); rest+=t; //回溯 a[t]--; } void get_ans() //判断一下能否用这个长度,然后就搜索。 { if (rest >= 69) sear_ch(69); if (rest >=39) sear_ch(39); } void output_ans() { printf("%d ",a69); printf("%d ",a39); printf("%d ",minrest); } int main() { input_data(); get_ans(); output_ans(); return 0; }