简单的01-背包问题:
动态转移方程:
dp[i-1][v]=max(dp[i-1][v],d[i][v-vol[i]]+val[i]);
二维数组程序:
#include<stdio.h>
#include<string.h>
int dp[1100][1100];
int val[1100],vol[1100];
int max(int a,int b)
{
if(a<b)
return b;
return a;
}
int main()
{
int n,i,t,m,j;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(val,0,sizeof(val));
memset(vol,0,sizeof(vol));
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
for(i=1;i<=n;i++)
{
scanf("%d",&vol[i]);
}
for(i=1;i<=n;i++)
{
for(j=0;j<=m;j++)
{
if(vol[i]<=j&&dp[i-1][j]<dp[i-1][j-vol[i]]+val[i])
dp[i][j]=dp[i-1][j-vol[i]]+val[i];
else
dp[i][j]=dp[i-1][j];
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}
一位数组程序:
#include<stdio.h>
#include<string.h>
int dp[1100];
int val[1100],vol[1100];
int max(int a,int b)
{
if(a<b)
return b;
return a;
}
int main()
{
int n,i,t,m,j;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
memset(val,0,sizeof(val));
memset(vol,0,sizeof(vol));
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&val[i]);
}
for(i=1;i<=n;i++)
{
scanf("%d",&vol[i]);
}
for(i=1;i<=n;i++)
{
for(j=m;j>=vol[i];j--)
{
dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);
}
}
printf("%d\n",dp[m]);
}
return 0;
}