记录编号 317042 评测结果 AAAAAAAAAA
题目名称 量取牛奶 最终得分 100
用户昵称 GravatarNewBee 是否通过 通过
代码语言 C++ 运行时间 1.763 s
提交时间 2016-10-07 16:49:35 内存使用 25.48 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("milk4.in","r",stdin);freopen("milk4.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=20010;
int f[110][maxn];
int pre1[110][maxn],pre2[110][maxn],w[110];
void chul(){
	int q,p,n;
	scanf("%d%d",&q,&p);
	for(int i=1;i<=p;i++)scanf("%d",&w[i]);
	sort(w+1,w+1+p);
	n=p;
	for(int i=1;i<=p;i++){
		if(w[i]==w[i-1]){
			w[i]=0x7f7f7f7f;
			n--;
		}
	}
	memset(f,0x7f,sizeof(f));
	f[0][0]=0;
	sort(w+1,w+1+p);
	int ans1=200,ans2[110],ans3[110];
	for(int i=1;i<=n;i++){
		for(int j=w[i];j<=q;j++){
			for(int m=0;m<i;m++){
				for(int k=1;k*w[i]<=j;k++){
					if(f[i][j]>=f[m][j-k*w[i]]+1){
						f[i][j]=f[m][j-k*w[i]]+1;
						pre1[i][j]=m;
						pre2[i][j]=k;
						if(j==q){
							if(f[i][j]<ans1){
								ans1=f[i][j];
								int x=i,y=j;
								ans2[0]=0;
								while(x!=0){
									int tim=y;
									ans2[++ans2[0]]=x;
									y=y-pre2[x][y]*w[x];
									x=pre1[x][tim];
								}
								reverse(ans2+1,ans2+1+ans2[0]);
								ans2[ans2[0]+1]=0x7f7f7f7f;
							}
							else if(f[i][j]==ans1){
								int x=i,y=j;
								ans3[0]=0;
								while(x!=0){
									int tim=y;
									ans3[++ans3[0]]=x;
									y=y-pre2[x][y]*w[x];
									x=pre1[x][tim];
								}
								reverse(ans3+1,ans3+1+ans1);
								bool flag=1;
								for(x=1;x<=ans1;x++){
									if(ans3[x]<ans2[x]){
										flag=0;
										break;
									}
								}
								if(!flag){
									for(x=0;x<=ans1;x++){
										ans2[x]=ans3[x];
									}
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d ",ans1);
	for(int i=1;i<=ans1;i++)printf("%d ",w[ans2[i]]);
}
int main(){
	Begin;
}