标签:ret 最优 code pac 动态规划 namespace int cout out
完全基于中山纪念中学 宋新波ppt的一次复习
子问题最优化结构
未来与过去无关
描述最优解的结构
递归定义最优解的值
用记忆化搜索或迭代法求解
有N种物品和一个容量为V的背包。
第i种物品只有1个,体积是v[i],价值是w[i]。
选择物品装入背包使这些物品的体积总和不超过背包容量,且价值总和最大,求出这个最大价值。
\(f[i,j]\)表示用体积为j的背包装前i个物品能获得的最大价值。考虑第i种物品装或不装进行状态转移:
\(f[i-1,j-v[i]]+w[i]\)(必须满足\(j>=v[i]\))
\(f[i-1,j]\)
#include <bits/stdc++.h>
using namespace std;
const int Max=1e4+10;
int w[Max],v[Max];
int f[Max][Max]={0};
int main()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>v[i];
for(int i=1; i<=n; i++) cin>>w[i];
for(int i=1; i<=n; i++)
for(int j=0; j<=m; j++)
if(j<v[i]) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
cout<<f[n][m]<<endl;
return 0;
}
有N种物品和一个容量为V的背包。
第i种物品有无穷个,体积是v[i],价值是w[i]。
选择物品装入背包使这些物品的体积总和不超过背包容量,且价值总和最大,求出这个最大价值。
\(f[i,j]\)表示用体积为j的背包装前i个物品能获得的最大价值。
考虑第\(i\)个物品装几个来进行状态转移,假设装\(x\)个,\(x\)的范围为\(0<=x<=j / v[i]\)
#include <bits/stdc++.h>
using namespace std;
const int Max=1e4+10;
int w[Max],v[Max];
int f[Max][Max]={0};
int main()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>v[i];
for(int i=1; i<=n; i++) cin>>w[i];
for(int i=1; i<=n; i++)
for(int j=0; j<=m; j++)
for(int x=0; x<=j/v[i]; x++)
f[i][j]=max(f[i][j],f[i-1][j-x*v[i]]+x*w[i]);
cout<<f[n][m]<<endl;
return 0;
}
\(f[i,j]\)表示用体积为j的背包装前\(i\)个物品能获得的最大价值。
必须满足\(j>=v[i]\),由于物品有无穷多个,装一次后后面还可以再装,所以状态为\(f[i,j-v[i]]+w[i]\);
\(f[i-1,j]\)
#include <bits/stdc++.h>
using namespace std;
const int Max=1e4+10;
int w[Max],v[Max];
int f[Max][Max]={0};
int main()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>v[i];
for(int i=1; i<=n; i++) cin>>w[i];
for(int i=1; i<=n; i++)
for(int j=0; j<=m; j++)
if(j<v[i]) f[i][j]=f[i-1][j];
else f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]);
cout<<f[n][m]<<endl;
return 0;
}
标签:ret 最优 code pac 动态规划 namespace int cout out
原文地址:https://www.cnblogs.com/vasairg/p/12385336.html