一维数组解法:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int dp[1001],vol[1001],val[1001];
int main()
{
intt,n,i,j,v;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&v);
for(i=1;i<=n;i++)
scanf("%d",&val[i]);
for(i=1;i<=n;i++)
scanf("%d",&vol[i]);
memset(dp,0,sizeof(dp)); //初始化
for(i=1;i<=n;i++)
for(j=v;j>=vol[i];j--)
if(dp[j]<dp[j-vol[i]]+val[i])
dp[j]=dp[j-vol[i]]+val[i];
printf("%d\n",dp[v]);
}
return0;
}
二位数组解法:
#include <iostream>
using namespace std;
#define max(a, b) (a) > (b) ? (a) : (b)
int T;
int N, V;
int volume[1005];
int value[1005];
int dp[1005][1005];
int main()
{
#ifndef ONLINE_JUDGE
freopen("2602.txt", "r", stdin);
#endif
cin >> T;
while (T--)
{
cin>> N >>V;
int i, j;
for (i = 1; i <=N; i++)
{
cin>> value[i];
}
for (i = 1; i <=N; i++)
{
cin>> volume[i];
}
memset(dp, 0,sizeof(dp));
for (i = 1; i <=N; i++)
{
for (j = 0; j<= V; j++)
{
if(j >= volume[i])
{
dp[i][j]= max(dp[i - 1][j], dp[i - 1][j - volume[i]] + value[i]);
}
else
{
dp[i][j]= dp[i - 1][j];
}
cout<< "i = "<< i <<"j = " << j<< " value ="<< dp[i][j]<< " "<< endl;
}
cout<< endl;
}
cout<< endl;
cout<< dp[N][V]<< endl;
}
return 0;
}