记录编号 317193 评测结果 AAAAAATTAT
题目名称 量取牛奶 最终得分 70
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 3.128 s
提交时间 2016-10-07 19:18:36 内存使用 17.10 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<functional>
using namespace std;
const int maxn=110,maxv=20010;
void dfs(int,int);
int n,v,w[maxn],f[maxn][maxv][2],ans;
bool vis[maxv];
int a[maxn],b[maxn];
int main(){
#define MINE
#ifdef MINE
	freopen("milk4.in","r",stdin);
	freopen("milk4.out","w",stdout);
#endif
	scanf("%d%d",&v,&n);
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	memset(f,63,sizeof(f));
	f[0][0][0]=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=v;j++)f[i][j][0]=min(f[i-1][j][0],f[i-1][j][1]);
		for(int j=w[i];j<=v;j++)f[i][j][1]=min(min(f[i-1][j-w[i]][0]+1,f[i-1][j-w[i]][1]+1),min(f[i][j-w[i]][0]+1,f[i][j-w[i]][1]));
	}
	ans=min(f[n][v][0],f[n][v][1]);
	printf("%d",ans);
	sort(w+1,w+n+1);
	dfs(1,0);
	for(int i=1;i<=ans;i++)printf(" %d",b[i]);
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#else
	fclose(stdin);
	fclose(stdout);
#endif
	return 0;
}
void dfs(int i,int cnt){
	if(cnt==ans){
		fill_n(vis+1,v,false);
		vis[0]=true;
		for(int j=1;j<=v;j++)for(int k=1;k<=cnt;k++)if(j>=a[k])vis[j]|=vis[j-a[k]];
		if(vis[v]){
			memcpy(b,a,sizeof(a));
			return;
		}
	}
	if(i>n)return;
	a[cnt+1]=w[i];
	dfs(i+1,cnt+1);
	if(b[1])return;
	dfs(i+1,cnt);
}
/*
16 3 3 5 7
Answer:
2 3 5
*/