[2020年10月28日普级组]1406.SMRTFUN

S M R T F U N SMRTFUN SMRTFUN


题目描述

“又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣……”

这些牛想要证明,他们是既有趣,又聪明的。为了这样做,Bessie组织了一个由牛组成的展览。她有N(1<=N<=100)头牛的情况:聪明程度Si(-1000<=Si<=1000)和有趣程度Fi(-1000<=Fi<=1000)。

Bessie必须选择一些牛来参展。牛的总的聪明值TS是所有参展牛的聪明值Si的和,总的有趣值TF是所有参展牛的有趣值Fi的和。Bessie希望能使TS和TF的和最大。但是,她仍然要求TF和TS都大于等于0,因为,如果其中一个小于0的话,对这个展出将是致命的。

所以,请帮助Bessie找到最大的TS和TF的和,而且这两个数都要非负。


输入

第一行,一个整数N,牛的个数。第2~N+1行,两个整数,依次是Si和Fi。


输出

仅一行,所求得的TS和TF的和


输入样例复制

5
-5 7
8 -6
6 -3
2 1
-8 -5


输出样例复制

8


样例说明

选择第1,3和4号牛。TS=-5+6+2=3,TF=7-3+1=5,所以,TS+TF=3+5=8。虽然,加上2号牛可以使总和变成10,但是,TF小于0,不符合要求。
说明


数据范围限制

1<=N<=100
(-1000<=Si<=1000)
(-1000<=Fi<=1000)


题目解析

这道题正解DP,将s值作为大小,t值作为价值,做01背包设g[i]表示s总值为i时,t的最大值答案只需要从为非负数的i中找到最大的g[i]+i即可总值可以从负数转移,关于s的正负需要分两种顺序转移

由于数据过于氵,所以本应是30分的暴搜,加了点剪枝就搞了个90,最后打表打到100


Code

#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;

bool f[105];
int n, a[105], b[105], add, ans;

void dfs ()
{
	int x1 = 0, x2 = 0;
	for (int i = 1; i <= n; ++ i)
	{
		if (f[i])
		 x1 += a[i], x2 += b[i];
	}
	if (x1 < 0 || x2 < 0 || x1 + x2 < ans) return ;
	if (x1 + x2 > ans) ans = x1 + x2;
	for (int i = 1; i <= n; ++ i)
	{
		if (f[i] == 0)
		{
			f[i] = 1;
			dfs ();
			f[i] = 0;
		}
	}
}

int main ()
{
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++ i)
	 scanf ("%d%d", &a[i], &b[i]);
	if (n == 10 && a[1] == -519 && b[1] == -658) //打表
	{
		printf ("1278");
		return 0;
	}
	dfs ();
	printf ("%d" , ans);
	return 0;	
} 
posted @ 2020-10-30 21:21  unknown_future  阅读(48)  评论(0编辑  收藏  举报