记录编号 189976 评测结果 AAAAAAAAAA
题目名称 1087.[福州培训2010] 砝码称重 最终得分 100
用户昵称 Gravatar四季木哥 是否通过 通过
代码语言 C++ 运行时间 0.852 s
提交时间 2015-09-30 22:39:47 内存使用 0.39 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;

short n, m, answer, C[21], a[21];
short  f[21][2005];

inline short max(short a,short b){
	return a>b?a:b;
}

void solve(short k,short cnt){
	if(k==n+1){
		int ans=0;
		if(cnt==m)
			for(int j=0;++j<=C[n];)
				ans+=f[n][j];
		answer=max(answer,ans);
		return; 
    }
	for(int j=a[k]-1;++j<=C[k];)
		f[k][j]=max(f[k-1][j],f[k-1][j-a[k]]);
	for(int j=-1;++j<a[k];) f[k][j]=f[k-1][j];	
	solve(k+1,cnt);//取 
	if(cnt<m){
		for(int j=-1;++j<=C[k];)	
			f[k][j]=f[k-1][j];
		solve(k+1,cnt+1);//不取 
	}
}

int main(){
	freopen("weight.in","r",stdin);
	freopen("weight.out","w",stdout);
	scanf("%hd%hd",&n,&m);
	for(int i=0;++i<=n;){
		scanf("%hd",&a[i]);
		C[i]=C[i-1]+a[i];
	}
	f[0][0]=1;
	solve(1,0);
	printf("%hd",answer);
return 0;
}