继续打卡,今天的题就只有2个:P1219,P2392。但感觉收获很大,做题贵精不贵多。
首先是P1219,经典的八皇后问题,以前就写过,但是今天又重新写了一遍,又体悟了一遍深搜,感觉又温故知新的感觉。上代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int cnt = 0;
int n;
int ans[100];
int vis1[100];
int vis2[100];
int vis3[100];
void dfs(int i)
{
if (i > n)
{
if (cnt <= 2)
{
for (int j = 1; j <= n; j++)
{
printf("%d ", ans[j]);
}
puts("");
}
cnt++;
return;
}
for (int j = 1; j <= n; j++)
{
if(!vis1[j] && !vis2[n+i-j] && !vis3[i + j])
{
ans[i] = j;
vis1[j] = 1;
vis2[n + i - j] = 1;
vis3[i + j] = 1;
dfs(i + 1);
vis1[j] = 0;
vis2[n + i - j] = 0;
vis3[i + j] = 0;
}
}
}
int main()
{
cin >> n;
dfs(1);
cout << cnt;
return 0;
}
这道题的收获就是知道了如何分开记录行和列的数据,以前都是全部输出的。
然后就是P2392,这个说是搜索但是事实上是背包问题,又让我复习了一下忘掉的知识,这里推荐大家看看B站上大雪莱的背包九讲专题,讲的很好,我就是通过这个入门的。还有就是dd大牛的背包九讲博客。也很好。
现在上代码:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int times[4];
int dataa[24];
int f[24][1205];
int ans = 0;
int main()
{
for (int i = 0; i < 4; i++)
{
cin >> times[i];
}
for (int i = 0; i < 4; i++)
{
int sum = 0;
for (int j = 1; j <= times[i]; j++)
{
cin >> dataa[j];
sum += dataa[j];
}
sort(dataa+1, dataa+1 + times[i]);
int t1 = 0;
for (int j = 1; j <= times[i]; j++)
{
for (int k = 0; k <= sum / 2; k++)
{
f[j][k] = f[j - 1][k];
if (k >= dataa[j])
f[j][k] = max(f[j][k], f[j - 1][k-dataa[j]] + dataa[j]);
t1 = max(f[j][k], t1);
}
}
ans += max(t1, sum - t1);
}
cout << ans << endl;
return 0;
}