I NEED HELP!

题目描述

提交记录

C. 选取整数

Problem ID: 7151

Contest ID: 5881

必做题

Runtime Error

题目描述

从 1 到 n 中选择若干个数,它们的总和不超过 n。 每个选择的数字都有自己的约数个数。
将这些数的约数个数相加,您可以得到一个总和。 找出这些所选数字的最大约数个数总和。
注意:这个总和不是那些选择的数字的总和,而是约数个数的总和。

输入样例

2

输出样例

2

数据约定

n<=1000

时间和空间约定

1s ,512M

#include <bits/stdc++.h>
#define maxn 400
#define maxm 2000
using namespace std;
int n,m;
int d[maxn];
int dp[maxn][maxm]={0};

int check(const int& x)
{
	int ans=0;
	for (int i=1;i*i<=x;i++) 
		if (x%i==0) 
		{
			if (x/i!=i)
				ans+=2;
			else 
				ans++;
		}
	return ans;
}

void init()
{
	cin>>n;
	for (int i=1;i<=n;i++)
		d[i]=i;
	return;
}


void dpdo()
{
	for (int j=d[1];j<=n;j++) dp[1][j]=check(d[1]);
	for (int i=2;i<=n;i++)
		for (int j=1;j<=n;j++) 
 		{
 			dp[i][j]=dp[i-1][j];
 			if (j+d[i]>n)
 				dp[i][j]=max( dp[i-1][j-check(d[i])]+check(d[i]),dp[i][j]);
		}
	return;
}

void print()
{
	cout<<dp[n][n]; 
	return;
}
int main()
{
	init();
	dpdo();
	print(); 
	return 0;
}

RE0分