01背包问题
#include<iostream>
#include<cstring>
using namespace std;
int dp[1005][1005];
int main()
{
int t,n,m,a[1005],b[1005],i,j;
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
for(i=1;i<=n;i++)
{
for(j=0;j<=m;j++)
{
if(b[i]<=j)
{
dp[i][j]=max(dp[i-1][j],a[i]+dp[i-1][j-b[i]]);//01背包动态转移方程
}
else
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][m]<<endl;
}
return 0;
}
本文介绍了一个经典的01背包问题,并通过C++代码详细解释了如何利用动态规划解决该问题。文章包含完整的代码实现,演示了输入物品价值与重量后如何计算最大价值。

161

被折叠的 条评论
为什么被折叠?



