poj 1882

简单dp,注意输出顺序。

代码:

#include<iostream>
#include<fstream>

using namespace std;

bool dp[11][1001];
int a[11][1001];

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t,ans,ans1,num,n,f,right,s1;
	while(1){
		cin>>num;
		if(num==0) return;

		cin>>k;
		ans=0;ans1=0;
		for(i=1;i<=k;i++)
		{
			cin>>n;
			a[i][0]=n;
			right=0;
			memset(dp,0,sizeof(dp));
			dp[0][0]=1;
			for(f=1;f<=n;f++)
			{
				cin>>s;a[i][f]=s;
				int end=right;
			for(s1=0;s1<num;s1++)
			for(j=0;j<=end;j++)
				if(dp[s1][j])
				{
					
					
					for(t=1;t+s1<=num;t++)
					{
						dp[t+s1][j+s*t]=1;
						if(right<j+s*t) right=j+s*t;
					}
				}
			}
			for(j=1;;j++)
			{
				for(s=1;s<=num;s++)
					if(dp[s][j])
						break;
				if(s>num) break;
			}
			
			if(ans<j) {
				ans=j;
				ans1=i;
			}
			else
				if(ans==j)
				{
					if(a[ans1][0]>a[i][0])
					{
						ans1=i;
					}
					else
					{
						if(a[ans1][a[ans1][0]]>a[i][a[i][0]])
							ans1=i;
					}
				}

		}
		printf("max coverage = %d : ",ans-1);
		for(i=1;i<=a[ans1][0];i++)
			cout<<a[ans1][i]<<' ';
		cout<<endl;
	}

}

int main(){
	read();
	return 0;
}

posted on 2011-03-28 11:03  宇宙吾心  阅读(300)  评论(0编辑  收藏  举报

导航