链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
定义 :struct point {
int va;//价值
int v;//体积
}vis[1020];
可以得出递推公式 dp[i][j]=max(dp[i-1][j],dp[i-1][j-vis[i].v]+vis[i].va);
代码如下:
<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
struct point
{
int v,m;
}a[1020];
int dp[1020][1020];
int main()
{
int T;
scanf ( "%d", &T );
while ( T-- )
{
int n, i, V, j;
memset(dp,0,sizeof(0));
scanf( "%d %d", &n, &V);
for( i = 1; i <= n; i ++ )
{
scanf("%d", &a[i].m);
}
for( i = 1; i <= n; i ++ )
{
scanf("%d", &a[i].v);
}
for( i = 1; i <= n; i ++ )
{
for( j = 0;j <= V; j ++ )
{
if(j>=a[i].v)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i].v]+a[i].m);
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][V]<<endl;
}
return 0;
}
也可以对空间进行优化,写作:dp[j]=max(dp[j],dp[j-vis[i].v]+vis[i].va);
不过计算时体积V要从大到小进行,若从小到大则计算之前大的值一发生变化:
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
struct point
{
int v,m;
}a[1020];
int dp[1020];
int main()
{
int T;
scanf ( "%d", &T );
while ( T-- )
{
int n, i, V, j;
memset(dp,0,sizeof(dp));
scanf( "%d %d", &n, &V);
for( i = 1; i <= n; i ++ )
{
scanf("%d", &a[i].m);
}
for( i = 1; i <= n; i ++ )
{
scanf("%d", &a[i].v);
}
for( i = 1; i <= n; i ++ )
{
for( j = V;j >= a[i].v; j -- )
{
dp[j]=max(dp[j],dp[j-a[i].v]+a[i].m);
}
}
cout<<dp[V]<<endl;
}
return 0;
}