记录编号 |
301849 |
评测结果 |
AAAAAAAAAA |
题目名称 |
硬币问题 |
最终得分 |
100 |
用户昵称 |
Go灬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);
}