亲,你能想到更好的解决方法吗?

第五届全国ITAT教育工程就业技能大赛决赛试题
C语言程序设计

1、求解钢材切割的最佳订单。(60分)

(1)描述:编写程序,从订单中选择一组订单对钢材作切割加工,使钢材得到最佳利用,约定每一次切割会损耗固定长度的钢材(约定该值为2)。已知线型钢材总长度、订单数和各订单需要的钢材长度;

(2)输入:钢材总长度s、订单数n、各定单需要的钢材长度;

(3)输出:可以使钢材得到最佳利用的订单号、该订单需要的钢材长度。

例如:

Please input total length of the steel  s:28(回车)

Please input number of order  n:8(回车)

Please input the orders :

5(回车)

6(回车)

7(回车)

8(回车)

9(回车)

10(回车)

12(回车)

15(回车)

屏幕输出:

Choice one order 1 length=5  order 3length=7  order 7 length=12

Choice two order 2 length=6  order 4length=8  order 6 length=10

 

   Pressany key to quit …

2、产生无连续重复部分的字符串。(60分)

(1)描述:编写程序,产生由1,2,3这3个数字符号所构成、长度为n的字符串,并且在字符串中对于任何一个子串而言,都不会有相邻的、完全相同的子串;

(2)输入:字符串长度n;

(3)输出:无相邻重复子串的所有字符串,每个字符串换行输出。

例如:

Please input string length n: 5 (回车)

屏幕输出:

13121

13123

13212

……


附小女子第一题答案:

// 钢材订单.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

//把s分成a,b,c,每次的消耗为2
void part_1(int s,int a,int b,int c,int d,int e,int f,int g,int h)
{
	for(int i=0;i<=s/a;i++)
	{
		for (int j=0;j<=s/b;j++)
		{
			for (int k=0;k<=s/c;k++)
			{
				for (int l=0;l<=s/d;l++)
				{
					for ( int m=0;m<=s/e;m++)
					{
						for (int n=0;n<=s/f;n++)
						{
							for ( int o=0;o<=s/g;o++)
							{
								for (int p=0;p<=s/h;p++)
								{
									int use=i*a+j*b+k*c+l*d+m*e+n*f+o*g+p*h+(i+j+k+l+m+n+o+p-1)*2;
									if (use==s)
									{
										cout<<i<<"	"<<j<<"	"<<k<<"	"<<l<<"	"<<m<<"	"<<n<<"	"<<o<<"	"<<p<<endl;
									}
								}
							}
						}
					}
				}				
			}			
		}
	}
}


//把A中的元素分成3份,使得每份元素之和等于s
//n为A[]的长度
void part_2(int A[],int n,int s)
{
	for (int i=0;i<n;i++)
	{
		for (int j=i;j<n;j++)
		{
			for (int k=j;k<n;k++)
			{
				if (A[i]+A[j]+A[k]==s-4 && A[i]!=A[j] && A[j]!=A[k] && A[k]!=A[i])//考虑截取的顺序不同
				{
					cout<<A[i]<<"	"<<A[j]<<"	"<<A[k]<<"	"<<endl;
				}
			}
		}
	}
}

//把A中的元素分成m份,使得每份元素之和等于s
//n为A[]的长度
void part_3(int A[],int n,int s,int m)
{
	int i;
	//添加代码
	//……
	{
		int total=0;//实际使用的
		for ( i=0;i<m;i++)
		{
			total+=A[i];
		}
		if (total==s-(m-1)*2)
		{
			for ( i=0;i<m;i++)
			{
				cout<<A[i]<<"	";
			}
			cout<<endl;	
		}
	}

}
int _tmain(int argc, _TCHAR* argv[])
{
	/**/
	cout<<"-----------------------"<<"第一种方法"<<"--------------------------"<<endl;
	int order1=5;//订单1要求的钢材长度
	int order2=6;//订单2要求的钢材长度
	int order3=7;//订单3要求的钢材长度
	int order4=8;//订单4要求的钢材长度
	int order5=9;//订单5要求的钢材长度
	int order6=10;//订单6要求的钢材长度
	int order7=12;//订单7要求的钢材长度
	int order8=15;//订单8要求的钢材长度

	cout<<order1<<"	"<<order2<<"	"<<order3<<"	"<<order4<<"	"<<order5<<"	"<<order6<<"	"<<order7<<"	"<<order8<<endl;
	part_1(28,order1,order2,order3,order4,order5,order6,order7,order8);
	

	/**/
	cout<<"-----------------------"<<"第二种方法"<<"--------------------------"<<endl;
	int A[8]={5,6,7,8,9,10,12,15};
	part_2(A,8,28);
	
	/*
	cout<<"-----------------------"<<"第三种方法"<<"--------------------------"<<endl;
	int A[8]={5,6,7,8,9,10,12,15};
	part_3(A,8,28,3);
	*/
	system("pause");
	return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值