`
carmark
  • 浏览: 160873 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
社区版块
存档分类
最新评论

1010 STAMPS

阅读更多
#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.rar_1010 STAMPS

    本题“1010 STAMPS”就是这样一个运用动态规划思想解决的实际问题。从描述中我们可以了解到,这个问题提供了三种不同的C++代码实现,下面我们将详细探讨这个问题及其解决方案。 首先,我们要明确问题背景。假设我们...

    POJ1010-STAMPS

    【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...

    POJ1010-STAMPS 测试数据

    标题“POJ1010-STAMPS 测试数据”涉及的是一个编程竞赛问题,源自北京大学ACM(美国计算机学会)在线判题系统POJ(Problem Online Judge)。问题STAMPS是1998年太平洋西北地区的比赛题目,旨在考验参赛者解决实际...

    1010_stamps.zip_1010_POJ 1010_poj_poj stamps_poj10

    《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...

    杭电题目分类

    1014STAMPS可能需要搜索或动态规划的技巧;1024Pseudo-random Numbers则与数论相关。 5. **算法类**:题目中涉及到各种算法,包括排序(1004)、搜索(1005、1045)、动态规划(1026、1042、1052)、贪心(1004、...

    递归与分治--acm竞赛资料

    1010 - STAMPS问题可能是一个组合优化问题,可以利用递归或者动态规划求解最优化的邮票组合。在实际编程中,递归和分治往往结合使用,以达到更高效的问题解决。 总之,递归与分治是ACM竞赛中不可或缺的工具,它们能...

    hdu题目分类

    10. **1010 Rails 模拟题(堆栈)** - **知识点**: 数据结构、堆栈。 - **描述**: 使用堆栈实现铁路调度。 - **难度级别**: 中等。 - **解题思路**: 使用堆栈进行模拟操作。 11. **1012 IMMEDIATE DECODABILITY...

Global site tag (gtag.js) - Google Analytics