//完全背包问题
#include<iostream>
#include<algorithm>
using namespace std;
int dp[4][8];
int main()
{
int n=3;//3种物品
int W=7;//7个容量
int w[4]={0,3,4,2};
int v[4]={0,4,5,3};
//dp[i][j]:表示 用前i个物品 j容量限制下的最大 价值
for(int i=0;i<7;i++)
dp[0][i]=0;
for(int i=0;i<4;i++)
dp[i][0]=0;
/*
for(int i=1;i<=3;i++)
for(int j=1;j<=7;j++)
for(int k=0;k*w[i]<=j;k++)
{
dp[i][j]=max(dp[i][j],dp[i-1][j-k*w[i]]+v[i]*k);
//要k个物品i 以后剩下的容积 用原来i-1个物品可得的最大价值加上k个i的价值
//这些要法里选一个最大的
} */
//优化
for(int i=1;i<=3;i++)
for(int j=1;j<=7;j++)
if(j<w[i])//没法选 相当于不考虑第i个物品
dp[i][j]=dp[i-1][j];
else
//选的话选几个呢,肯定能选1个,还可能更多
//这里考虑的是能不能 再选一个 肯定多选一个更大了呗
//多选一个更大了,但是和一个也不选比较呢
//多选一个 那么选这个之前的最大 是dp[i][j-w[i]]多选要加v[i]
dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
//max(一个也不选,多选一个)
cout<<dp[3][7]<<endl;
return 0;
}
//还能优化为一维数组
动态规划 完全背包问题 zzzz
最新推荐文章于 2021-03-22 21:31:31 发布