ACM简单题目。。C语言求教

来源:百度知道 编辑:UC知道 时间:2024/06/27 22:17:06
节假日到了,某商场搞促销活动,边同学是个购物狂,听到这个消息,他就想乘此机会大购一把。他带了n元钱到了商场,发现自己很幸运,因为有3样自己最想要的东西,价格降的最多了。于是就决定把所有的钱用来买这3样东西,一元也不多出, 一元也不少花。

3样东西和价格分别是:

苹果:5元 1斤

饼干:7元1箱

葡萄干:3元1斤

钱是有了,买什么也想好了。但是他遇到的问题是怎么搭配才能把钱花完并且每种东西至少买一样。在这个基础上,他在决定哪个买多,那个买少一点。请你帮他解决这个问题。

输入:

一个cases 只有一个n( 1 <= n <= 500 ),有多组cases,以文件结束为结尾。

输出:

如果能全部花完,则输出这样全部花完可能的次数,并且每次输出相应的个数,格式如下:

2 (表示种数)

2 6 8 ( 分别表示 苹果 饼干 葡萄干 的个数 )

5 6 3

输出中间用空格格开,最后没有空格。如果有多组符合条件的分配的话,按字典序排序输出(即先按苹果数目排序输出,如果苹果数目相等,再按饼干数目排序输出,以此类推)。

如果不存在符合条件的分配,就打印:IMPOSSIBLE.

每组cases后面有一个空行。

Sample:

Input:

15

10

Output:

1

1 1 1

IMPOSSIBLE.

本人代码:
#include<iostream>
using namespace std;
int money ;
int i,j,k;//5 7 3
struct output
{
int a;
int b;
int c;
}m

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a[1000][3];
int num=0;
int n;

while(1)
{
bool ans=false;
cin>>n;
for(int i=1;i<=floor(n/5);i++)
for(int j=1;j<=floor(n/7);j++)
for(int k=1;k<=floor(n/3);k++)
{
if(5*i+7*j+3*k==n)
{
num++;
a[num][0]=i;
a[num][1]=j;
a[num][2]=k;
ans=true;
break;//节省时间
}
}

if(ans==false)
cout<<"IMPOSSIBLE";
else
{
cout<<num<<endl;
for(int ii=1;ii<=num;ii++)
cout<<a[ii][0]<<" "<<a[ii][1]<<" "<<a[ii][2]<<endl;
}
}
return 0;
}

/*我没有写eof,见谅
这个程序的复杂度还算可以,极限n=500时运算190000次,算是符合了吧?
我主要是在预定义三个数组,记录每种东东在500之内的所有价钱,然后循环的时候是有范围的,例如100元,i循环apple,i=10时,饼干最多(100-5*10)=7包......
给分哎给分啊~
*/
#include<iostream>