学习总结(7月21日)

一、题目

先来分享我做过的题目:

这道题目很像我们小学时候数学里面学过的合理利用时间,简单而言就是人们在做什么事情的时候又可以去做其他的事情,从而保证时间被最为合理的利用,以求得最短的时间内做完所有的事情。这道题目也差不多,就是说kkkcs03在做同一科题目的时候,大脑可以当两个用,例如:在写数学的时候,可以一起写选择题和问答题。

好,废话不多说。奉上代码:

#include<iostream>
using namespace std;
int a[5], i, j, k, sum, t, homework[21], dp[2501];
int main() 
{
	for (i = 1; i <= 4; i++)
		cin >> a[i];
	for (i = 1; i <= 4; i++) 
	{
		sum = 0;
		for (j = 1; j <= a[i]; j++)
		{
			cin >> homework[j];
			sum += homework[j];
		}
		for (j = 1; j <= a[i]; j++)
			for (k = sum / 2; k >= homework[j]; k--)
				dp[k] = max(dp[k], dp[k - homework[j]] + homework[j]);//01背包
		t += sum - dp[sum / 2];
		for (j = 1; j <= sum / 2; j++)
			dp[j] = 0;
	}
	cout << t;
	return 0;
}

虽然标签是写的搜索和递归,但很明显我这用的是dp。对于一道题只有两个状态,一是加到左脑,二是加到右脑,所以是01背包。按照01背包问题的套路去解决就好啦。

但是显然我并不是直接想到dp的,我在解题时是暴力解题的,结果成为了递归。代码如下:


#include<iostream>
#include<algorithm>
using namespace std;
int Left, Right, min1, ans;
int s[5];
int a[21][5];
void search(int x, int y)
{
	if (x > s[y])
	{
		min1 = min(min1, max(Left, Right));
		return;
	}
	Left += a[x][y];
	search(x + 1, y);
	Left -= a[x][y];
	Right += a[x][y];
	search(x + 1, y);
	Right -= a[x][y];
}
int main()
{
	for (int i = 1; i <= 4;i++)
	{
		cin >> s[i];
	}

	for (int i = 1; i <= 4; i++) 
	{
		Left = Right = 0;
		min1 = 20000000;
		for (int j = 1; j <= s[i]; j++)
			cin >> a[j][i];
		search(1, i);
		ans += min1;
	}
	cout << ans;
	return 0;
}

这样的思路就好想很多了,但主要还是拜与题目时间给的比较多。

二、学习

接下来讲一讲最近的学习成果,最近学的很快,基本上也就是过了一遍。好处就是学的真的很快,缺点也就是忘的很快。但是没得办法,必须加快速度,到时候抓着时间多学一学流。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值