4558184_wa.cpp

来自「部分PKU上的源码」· C++ 代码 · 共 125 行

CPP
125
字号
/*

ax[i]:第i种邮票的面值

need:顾客所需的总价值

answer:最佳方案的种数

p:搜索到第p种方案

x[i]:记录下一种方案中第i种邮票的张数

ans[i]:最佳方案中第i种邮票的张数

sum[i]:搜索到第i种邮票时,所有邮票的总价值

have:标志有没有解,有的话为1,否则为0

kind[i]:搜索到第i种邮票时总的种类数

sumnum[i]:搜索到第i种邮票时总的邮票张数

tmax[i]:搜索到第i种邮票时,最大的面值

maxkind:临时最佳方案的邮票种类

maxvalue:临时最佳方案中邮票的最大面值

maxnum:临时最佳方案中邮票的张数

count:最佳方案中邮票的种类数

n:邮票的种类数

*/

#include<iostream>
using namespace std;
int ax[100],need,answer,p,x[100],ans[100];
int sum[100],have,kind[100],sumnum[100],tmax[100];
int maxkind,maxvalue,maxnum,count,n;
int stop;
void res(int p)
{
	stop++;
    int i,j;
    for(i=0;i<=4;i++)//第p种邮票取的张数
   {
        if(i)kind[p]=kind[p-1]+1;
        else kind[p]=kind[p-1];
        sumnum[p]=sumnum[p-1]+i;
        sum[p]=sum[p-1]+i*ax[p];
        x[p]=i;
        if(i&&ax[p]>tmax[p-1]) tmax[p]=ax[p];else tmax[p]=tmax[p-1];
        if(sum[p]>need) break;
        if(sum[p]<need&&sumnum[p]<4&&p<n) res(p+1);
        if(!i)continue;
        if(sum[p]==need&&sumnum[p]<=4&&p<=n)
        {
            have=1;
            if(maxkind<kind[p])
            {
                answer=1;count=kind[p];
                for(j=1;j<=p;j++) ans[j]=x[j];ans[0]=p;
                maxvalue=tmax[p];
                maxnum=sumnum[p];
                maxkind=kind[p];
            }
            else if(maxkind==kind[p]&&sumnum[p]<maxnum)
            {
                answer=1;count=kind[p];
                for(j=1;j<=p;j++) ans[j]=x[j];ans[0]=p;
                maxvalue=tmax[p];
                maxnum=sumnum[p];
            }
            else if(maxkind==kind[p]&&maxnum==sumnum[p]&&maxvalue<tmax[p])
            {
                answer=1;count=kind[p];
                for(j=1;j<=p;j++) ans[j]=x[j];ans[0]=p;
                maxvalue=tmax[p];
            }
            else if(maxkind==kind[p]&&maxnum==sumnum[p]&&maxvalue==tmax[p])
                answer++;
        }
    }
}
int main()
{
    int i,j,k;i=1;
    while(cin>>ax[i++])
    {
        if(ax[i-1]==0)
        {
            n=i-1;
            while(cin>>need&&need!=0)
            {
				stop=0;
                memset(ans,0,sizeof(ans));
                kind[0]=sumnum[0]=tmax[0]=0;
                maxkind=maxnum=maxvalue=0;
                answer=0;sum[0]=0;have=0;count=0;
                res(1);
                if(have==0) {cout<<need<<" ---- none"<<endl;continue;}
                else if(answer==1)
                {
                    cout<<need<<" ("<<count<<"): ";
                    for(i=1;i<=ans[0];i++)
                        for(j=1;j<=ans[i];j++)
                        {
                            cout<<ax[i];
                            if(i==ans[0]&&j==ans[i])cout<<endl;
                            else cout<<" ";
                        }
                }
                else if(answer>=2)
                    cout<<need<<" ("<<count<<"): tie"<<endl;
				cout<<stop;
            }    
            i=1;
        }
    }
    return 0;
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?