您的位置:首页 > 其它

CSUOJ 1197- Staginner 买葡萄

2011-11-10 09:17 337 查看
这道题是基础背包问题,我们手里有n块钱,然后求n块钱能买到的最大葡萄个数,价格为j的

一串葡萄有除开j本身外其所有约数之和个葡萄。先将每串葡萄的个数求出来,再用状态转移

方程,dp[i] = max( dp[i], dp[n - j] +w[j])即可,i从n到0。

#include<stdio.h>
#include<string.h>
#define N 26
using namespace std;

int w
;
int dp
;
int max( int a, int b)
{
return a > b ? a : b;
}

int f( int n)
{
int sum = 0;
for( int i = 1; i <= n / 2 ; i ++)
if( n % i == 0)
sum += i;
return sum;
}

void init( )
{
for( int i = 2; i <= 25; i ++) {
w[i] = f(i);
dp[i] = 0;
}
for( int i = 2; i <= 25; i ++)
{
for( int j = 2; j <= 25; j ++)
{
for( int k = i; k >= 0; k --)
if( k >= j)
dp[k] = max( dp[k], dp[ k - j ] + w[j]);
}
}
}

int main()
{
int n;
init();
while( scanf( "%d", &n) != EOF)
{
printf( "%d\n", dp
);
}
return 0;
}


这代码我觉得自己写的不好...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: