记录编号 301849 评测结果 AAAAAAAAAA
题目名称 硬币问题 最终得分 100
用户昵称 GravatarGo灬Fire 是否通过 通过
代码语言 C++ 运行时间 0.132 s
提交时间 2016-09-02 16:26:45 内存使用 2.84 MiB
显示代码纯文本
#include<cstdio>//递归输出,递推见另一个 
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define LL long long
using namespace std;
const int maxn=150000;
int g_max[maxn],g_min[maxn],f_max[maxn],f_min[maxn],a[maxn];
int n,m,date;
void Init();
void Print_min(int date){
    if(date==0)return;
    printf("%d ",g_min[date]);
    Print_min(date-a[g_min[date]]);
}
void Print_max(int date){
    if(date==0)return;
    printf("%d ",g_max[date]);
    Print_max(date-a[g_max[date]]);
}
int main(){
    freopen("kouka.in","r",stdin);freopen("kouka.out","w",stdout);
    Init();
    //system("pause");
    return 0;
}
void Init(){
     scanf("%d%d",&n,&m);date=m;
     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
     memset(f_min,0x7f,sizeof(f_min));
     memset(f_max,-0x7f,sizeof(f_max));//必须初始化,否则会答案错误+超时,原因待定 
     f_min[0]=f_max[0]=0;
     for(int i=1;i<=m;i++){//必须先循环体积再循环n,否则输出的不是字典序,除非有评测插件!!! 
        for(int j=1;j<=n;j++){
            if(i>=a[j]){
                if(f_min[i]>f_min[i-a[j]]+1)g_min[i]=j,f_min[i]=f_min[i-a[j]]+1;
                if(f_max[i]<f_max[i-a[j]]+1)g_max[i]=j,f_max[i]=f_max[i-a[j]]+1;
            }
        }
    }
     printf("%d %d\n",f_min[m],f_max[m]);
     Print_min(m);printf("\n");Print_max(m); 
}