m个物品,体积各不相同
背包总空间vm
价值与体积input数据
5 10(5个物品,背包大小10)
1 2 3 4 5(价值)
5 4 3 2 1(体积)
求最大价值多少?
二维数组解决:
#include<iostream>
using namespace std;
int main()
{
int n;//输入的组数
int m,vm;
cin>>m>>vm;
int v[1000],w[1000];
for(int i=1;i<=m;i++)
{
cin>>w[i];
}
for(int i=1;i<=m;i++)
{
cin>>v[i];
}
int dp[100][100]={0};
for(int i=1;i<=m;i++)
{
for(int j=v[i];j<=vm;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
}
}
cout<<dp[m][vm];
return 0;
}
/*
5 10 容量10,5组数据
1 2 3 4 5价值
5 4 3 2 1体积
*/
优化后一维:
注意应该从后向前填值,前面是上一组的数据,后面是当前组,新的需要上一组才能求出来,用完就覆盖即可
#include<iostream>
using namespace std;
int main()
{
int n;//输入的组数
int m,vm;
cin>>m>>vm;
int v[1000],w[1000];
for(int i=1;i<=m;i++)
{
cin>>w[i];
}
for(int i=1;i<=m;i++)
{
cin>>v[i];
}
int dp[100]={0};
for(int i=1;i<=m;i++)
{
for(int j=vm;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout<<dp[vm];
return 0;
}
/*
5 10 容量10,5组数据
1 2 3 4 5价值
5 4 3 2 1体积
*/