简单的背包——01背包(11)
题目来源:洛谷 P1734 最大约数和
共十个测试点
题解
WA代码
#include <bits/stdc++.h>
using namespace std;
int add(int x)
{
int ans = 0;
for (int i = 1; i < x; ++i)
{
if (x % i == 0)
ans += i;
}
return ans;
}
const int maxn = 1e3 + 5;
int s;
int f[maxn], a[maxn];
int main()
{
memset(f, 0, sizeof(f));
scanf("%d", &s);
for (int i = 1; i <= s; ++i)
a[i] = add(i);
for (int i = 1; i <= s; ++i)
{
for (int j = s; j >= 1; --j)
{
f[j] = max(f[j], f[j - i] + a[i]);
}
}
printf("%d", f[s]);
return 0;
}
错误分析
未能理解状态转移方程
测试点通过情况
#3 ~ #10 WA
AC代码
#include <bits/stdc++.h>
using namespace std;
// 约数和
int add(int x)
{
int ans = 0;
for (int i = 1; i < x; ++i)
{
if (x % i == 0)
ans += i;
}
return ans;
}
const int maxn = 1e3 + 5;
int s;
int f[maxn], a[maxn];
int main()
{
memset(f, 0, sizeof(f));
scanf("%d", &s);
// 预处理 用数组处理缩短时间
for (int i = 1; i <= s; ++i)
a[i] = add(i);
for (int i = 1; i <= s; ++i)
{
for (int j = s; j >= i; --j)
{
f[j] = max(f[j], f[j - i] + a[i]);
}
}
printf("%d", f[s]);
return 0;
}