#include <iostream.h>
#include <strstrea.h>
#include <string.h>
int stamp[1006]; // from 1 to 25, stamp[0] means none
int s[4]; // stamps sold
int n; // number of stamp types
int m; // customer request
int k; // number of stamps sold
int t; // types of stamps sold
int max; // highest single-value stamp value
int curK; // numbers of stamps sold of current best solution
int curT; // types of stamps sold of current best solution
int curM; // highest single value of current best solution
int curS[4]; // current best solution
bool curTie; // if there is tie best solutions
int temp;
bool ok(int temp) // there are no maore than 4 stamps value=temp
{
int i,j;
for (i=1,j=0;i<=n;i++) if (stamp[i]==temp) j++;
return (j<5);
}
void Dodo(){
for ( s[0]=0; s[0]<n; s[0]++)
for ( s[1]=s[0]; s[1]<n; s[1]++)
for ( s[2]=s[1]; s[2]<n; s[2]++)
for ( s[3] = s[2]; s[3]<n; s[3]++) {
if ( stamp[s[0]]+stamp[s[1]]+stamp[s[2]]+stamp[s[3]] != m ) continue;
k = 0;
t = 0;
max = 0;
if ( stamp[s[0]] ) {k++; t++; if ( stamp[s[0]]>max ) max = stamp[s[0]];}
if ( stamp[s[1]] ) {k++; if ( s[1]>s[0] ) t++; if ( stamp[s[1]]>max ) max = stamp[s[1]];}
if ( stamp[s[2]] ) {k++; if ( s[2]>s[1] ) t++; if ( stamp[s[2]]>max ) max = stamp[s[2]];}
if ( stamp[s[3]] ) {k++; if ( s[3]>s[2] ) t++; if ( stamp[s[3]]>max ) max = stamp[s[3]];}
if ( t<curT ) continue;
if ( t>curT ) {
curT = t;
curK = k;
curM = max;
curS[0]=s[0]; curS[1]=s[1];curS[2]=s[2];curS[3]=s[3];
curTie = false;
continue;
}
if ( k>curK ) continue;
if ( k<curK ) {
curT = t;
curK = k;
curM = max;
curS[0]=s[0]; curS[1]=s[1];curS[2]=s[2];curS[3]=s[3];
curTie = false;
continue;
}
if ( max<curM ) continue;
if ( max>curM ){
curT = t;
curK = k;
curM = max;
curS[0]=s[0]; curS[1]=s[1];curS[2]=s[2];curS[3]=s[3];
curTie = false;
continue;
}
curTie = true;
}
if ( curT == -1 ) {
cout<<m<<" ---- none"<<endl;
return;
}
cout<<m<<" ("<<curT<<"):";
if ( curTie ) {
cout<<" tie"<<endl;
return;
}
for ( int i=0; i<4; i++)
if ( curS[i]>0 ) cout<<' '<<stamp[curS[i]];
cout<<endl;
}
int main() {
char strs[255];
cin.getline(strs,255);
while ( strlen(strs) ) {
istrstream in1(strs);
s[0] = 0;
n = 1;
while ( in1 ) {
in1>>temp; //modify by duoshute
if (ok(temp)) // there are no maore than 4 stamps value=temp
{
stamp[n++]=temp;
if ( stamp[n-1] == 0 ) break;
}
}
n--;
cin.getline(strs,255);
istrstream in2(strs);
while ( in2 ) {
in2>>m;
if ( m == 0 ) break;
curK = 100;
curT = -1;
curM = -1;
curTie = false;
Dodo();
}
cin.getline(strs,255);
}
return 0;
}
分享到:
相关推荐
本题“1010 STAMPS”就是这样一个运用动态规划思想解决的实际问题。从描述中我们可以了解到,这个问题提供了三种不同的C++代码实现,下面我们将详细探讨这个问题及其解决方案。 首先,我们要明确问题背景。假设我们...
【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...
标题“POJ1010-STAMPS 测试数据”涉及的是一个编程竞赛问题,源自北京大学ACM(美国计算机学会)在线判题系统POJ(Problem Online Judge)。问题STAMPS是1998年太平洋西北地区的比赛题目,旨在考验参赛者解决实际...
《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...
1014STAMPS可能需要搜索或动态规划的技巧;1024Pseudo-random Numbers则与数论相关。 5. **算法类**:题目中涉及到各种算法,包括排序(1004)、搜索(1005、1045)、动态规划(1026、1042、1052)、贪心(1004、...
1010 - STAMPS问题可能是一个组合优化问题,可以利用递归或者动态规划求解最优化的邮票组合。在实际编程中,递归和分治往往结合使用,以达到更高效的问题解决。 总之,递归与分治是ACM竞赛中不可或缺的工具,它们能...
10. **1010 Rails 模拟题(堆栈)** - **知识点**: 数据结构、堆栈。 - **描述**: 使用堆栈实现铁路调度。 - **难度级别**: 中等。 - **解题思路**: 使用堆栈进行模拟操作。 11. **1012 IMMEDIATE DECODABILITY...