IT民工
加油!

这道题还是0-1背包问题,看一个队能拿到的最大价值是多少并输出。开始理解错题意,将每个人能拿的

最大重量加在一块,然后一起拿一次。其实应该是每个人都拿一次...

#include<stdio.h>
#include<string.h>
#define MAXD 1005
int f[MAXD * 31];
int p[MAXD], w[MAXD];

int c, ans, T, N, G;

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

int main()
{
scanf( "%d", &T);
while( T --)
{
scanf( "%d", &N);
for( int i = 1; i <= N; i ++)
scanf( "%d%d", &p[i], &w[i]);
scanf( "%d", &G);
ans = 0;
while( G --)
{
scanf( "%d", &c);
memset( f, 0, sizeof f);
for( int i = 1; i <= N; i ++)
for( int j = c; j >= 0; j --)
if( j >= w[i])
f[j] = max( f[j], f[j - w[i]] + p[i] );
ans += f[c];
}
printf( "%d\n", ans);
}
return 0;
}

下面的代码不知道为啥超时了...

#include<stdio.h>
#include<string.h>
#define MAXD 1005
int f[MAXD][MAXD * 31];
int p[MAXD], w[MAXD];
int T, N, G, c, ans;

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

int main()
{
scanf( "%d", &T);
while( T --)
{
scanf( "%d", &N);
for( int i = 1; i <= N; i ++)
scanf( "%d%d", &p[i], &w[i]);
scanf( "%d", &G);
ans = 0;
while( G --)
{
scanf( "%d", &c);
memset( f, 0, sizeof f);
for( int i = 1; i <= N; i ++)
for( int j = 0; j <= c; j ++)
{
f[i][j] = ( i == 1 ? 0 : f[i - 1][j]);
if( j >= w[i])
f[i][j] = max( f[i][j], f[i -1][j - w[i]] + p[i]);
}
ans += f[N][c];
}
printf( "%d\n", ans);
}
return 0;
}



posted on 2011-12-02 22:43  找回失去的  阅读(190)  评论(0编辑  收藏  举报