好吧。。这题很郁闷。。。一直不知道怎么就WA了,后来看到别人说数组开大点。。。就AC了。。。这不是坑么。。。
题目大意:
给出n种邮票,每种邮票有自己的面值(面值可能重复)
指定m种“总面值”,对每种“总面值”,求解满足如下条件的组合以达到该“总面值”
(1) 所用邮票在n种中可以重复选取
(2) 所用邮票张数〈=4
(3) 尽量多的使用那个不同种类的邮票 Max (Stamp Types)
(4) 若有多种方案满足(3),则选取张数最小的一种方案 Min (Stamp Num)
(5) 若有多种方案满足(3)(4),则选取“最大面额”最高的一种方案。 Max(Heightest Value)
(6) 若有多种方案满足(3)(4)(5) 则输出 “tie” 1010
思路:
就直接遍历了,再进行一点剪枝。由于限定了张数是4张,也就直接模拟了,没有用递归啊栈啊一流。。。naive。。。
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define TYPE_NUM 100
int s_type[TYPE_NUM];
int p[5];
int need[5];
int record_p[5];
int g_tn;
int g_mn;
int g_mv;
bool tie_flag;
void ini_type()
{
memset(s_type,0,TYPE_NUM);
}
void ini_record()
{
memset(record_p,0,5);
}
void write_record()
{
copy(p,p+5,record_p);
}
void ini_value()
{
g_tn = 0; g_mn = 0;
g_mv = 0; tie_flag = false;
ini_record();
}
int set_best(int tn , int mn ,int mv)//1: success 0: tie -1: fail
{
if(tn>g_tn)
{
g_tn = tn;
g_mn = mn;
g_mv = mv;
tie_flag = false;
write_record();
return 1;
}
if(tn == g_tn)
{
if(mn < g_mn)
{
g_mn = mn;
g_mv = mv;
tie_flag = false;
write_record();
return 1;
}
if(mn == g_mn)
{
if(mv > g_mv)
{
g_mv = mv;
tie_flag = false;
write_record();
return 1;
}
if(mv == g_mv)
{
tie_flag = true;
return 0;
}
}
}
return -1;
}
void get_match( int n )
{
int tn[5] ,mv;
for(p[1] = n; p[1] >= 1 ; p[1] --)
{
tn[1]=1;
mv = s_type[p[1]];
if(s_type[p[1]] >= need[1])
{
if(s_type[p[1]] == need[1])
set_best(tn[1],1,mv);
continue;
}
need[2] = need[1] - s_type[p[1]];
for(p[2] = p[1]; p[2] >= 1 ; p[2] --)
{
if(p[2] == p[1])
{
tn[2] = tn[1];
}
else
{
tn[2] = tn[1]+1;
}
if(s_type[p[2]] >= need[2])
{
if(s_type[p[2]] == need[2])
set_best(tn[2],2,mv);
continue;
}
need[3] = need[2] - s_type[p[2]];
for(p[3] = p[2]; p[3] >= 1; p[3] --)
{
if(p[3] == p[2])
{
tn[3] = tn[2];
}
else
{
tn[3] = tn[2]+1;
}
if(s_type[p[3]] >= need[3])
{
if(s_type[p[3]] == need[3])
set_best(tn[3],3,mv);
continue;
}
need[4] = need[3] - s_type[p[3]];
for(p[4]= p[3]; p[4] >= 1; p[4] --)
{
if(p[4] == p[3])
{
tn[4] = tn[3];
}
else
{
tn[4] = tn[3]+1;
}
if(s_type[p[4]] >= need[4])
{
if(s_type[p[4]] == need[4])
{
set_best(tn[4],4,mv);
if(tie_flag == true && tn[4] == 4)
return ;
}
}
}
}
}
}
}
int main()
{
int c,n=0;
int i;
freopen("in.txt","r",stdin);
while(EOF != scanf("%d",&c))
{
s_type[n++] = c;
if(c == 0)
{
sort(&s_type[0],&s_type[n]);
scanf("%d",&c);
while(0 != c)
{
need[1] = c;
get_match(n-1);
if(g_tn == 0)
printf("%d ---- none\n",c);
else
if(tie_flag == true)
printf("%d (%d): tie\n",c,g_tn);
else
{
printf("%d (%d): ",c,g_tn);
for(i=g_mn;i>=1;i--)
{
printf("%d ",s_type[record_p[i]]);
}
printf("\n");
}
ini_value();
scanf("%d",&c);
}
n=0;
ini_type();
}
}
return 0;
}