一、题目
先来分享我做过的题目:
这道题目很像我们小学时候数学里面学过的合理利用时间,简单而言就是人们在做什么事情的时候又可以去做其他的事情,从而保证时间被最为合理的利用,以求得最短的时间内做完所有的事情。这道题目也差不多,就是说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;
}
这样的思路就好想很多了,但主要还是拜与题目时间给的比较多。
二、学习
接下来讲一讲最近的学习成果,最近学的很快,基本上也就是过了一遍。好处就是学的真的很快,缺点也就是忘的很快。但是没得办法,必须加快速度,到时候抓着时间多学一学流。