poj1015 java ((看了题解好久!!!!

import java.util.LinkedList;

import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int ok=1;
		while(sc.hasNext()) {

			int a=sc.nextInt(),b=sc.nextInt();
			if(a==b && b==0)break;
			int add[]=new int[205];int sub[]=new int[205];
			for (int i = 1; i <= a; i++)
			{
				int x=sc.nextInt(),y=sc.nextInt();add[i]=x+y;sub[i]=x-y;
			}
			//read in

			int dp[][]=new int[25][820];
			path path[][]=new path[25][820];
			for (int i = 0; i <25; i++)
				for (int j = 0; j <820; j++)
				{
					dp[i][j]=-1;path[i][j]=new path();
				}
			//return to first
			int fix=20*b;
			dp[0][fix]=0;
			for (int i = 1; i <=a; i++)
			{
				for (int j = b-1; j >=0; j--)
				{
					for (int k = 0; k <=2*fix; k++)
					{
						if (dp[j][k]>=0)
						{
							
							if (dp[j][k]+add[i]>dp[j+1][k+sub[i]])
							{
								dp[j+1][k+sub[i]]=dp[j][k]+add[i];
								path[j+1][k+sub[i]].x.clear();
								for(int xx:path[j][k].x)	path[j+1][k+sub[i]].x.add(xx);
								path[j+1][k+sub[i]].x.add(i);
							}
						}
					}
				}
			}
			//

			int kk;
			for(kk=0;kk<=fix;kk++)
				if (dp[b][fix+kk]>=0||dp[b][fix-kk]>=0)
				{
					break;
				}
			int S=dp[b][fix+kk]>dp[b][fix-kk]?fix+kk:fix-kk;
			int A=dp[b][S];
			int P =(A+(S-fix))/2;
			int D=(A-(S-fix))/2;
	
			System.out.println("Jury #"+ok);ok++;
			System.out.printf("Best jury has value %d for prosecution and value %d for defence:\n",P,D);
			for (int i:path[b][S].x)System.out.println(i);
			System.out.println();
		}
		}
	
}
class path{
	public LinkedList<Integer> x=new LinkedList<Integer>();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值