动态规划(2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_45664943/article/details/102772150

4.5 0-1背包问题
给定一个物品集合s={1,2,3,…,n},物品i的重量是wi,其价值是vi,背包的容量为W,即最大载重量不超过W。在限定的总重量W内,我们如何选择物品,才能使得物品的总价值最大。
如果物品不能被分割,即物品i要么整个地选取,要么不选取;
不能将物品i装入背包多次,也不能只装入部分物品i,则该问题称为0-1背包问题。
如果物品可以拆分,则问题称为背包问题,适合使用贪心算法。
阶段:
i~n ,依次处理每一件物品
状态:
背包的容量:0~V
决策:
在第i阶段,在背包容量是V 的情况下,如何处理第i 件物品,才能使装入背包中的物品最大。
f[i][v]表示前i件物品(部分或全部)放入一个容量为v的背包可以获得的最大价值。
处理方案:在W[i]>V的情况下,不装入;否则,根据
max{f[i-1][v],f[i-1][v-w[i]]+c[i]}
进行决策
状态转移方程便是:
f[i][v]=max{f[i-1][v],f[i-1][v-w[i]]+c[i]}。
  #include
using namespace std;
const int maxm = 201, maxn = 31;
int m, n; int w[maxn], c[maxn]; int f[maxn][maxm];
int max(int x,int y) { x>y?x:y;} //求x和y最大值
int main(){
scanf("%d%d",&m, &n); //背包容量m和物品数量n
for (int i = 1; i <= n; i++)
scanf("%d%d",&w[i],&c[i]); //每个物品的重量和价值
for (int i = 1; i <= n; i++) // f[i][v]表示前i件物品,总重量不超过v的最优价值
for (int v = m; v > 0; v–)
if (w[i] <= v)
f[i][v] = max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
else
f[i][v] = f[i-1][v];
printf("%d",f[n][m]); // f[n][m]为最优解
return 0;
}
4.6 最长单调递增子序列
设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列。
输入: 第1个整数n(0<n<100),表示后面有n个数据,全部为整数。
输出: 输出最长单调递增子序列的长度;
样例输入
8 65 158 170 155 239 300 207 389
样例输出
6
用数组b[0:i]记录以a[i] (0≤i<n) 为结尾元素的最长递增子序列的长度。
序列a的最长递增子序列的长度为:max {b[i]} (0≤i<n)
显然,b[i]满足最优子结构性质。
证明:根据b[i] 的定义:
b[i]为以a[i] (0≤i<n) 结尾的最长单调子序列长度。
即 存在一个 a[k],1<=k<=i-1 ,并且 a[i]>=a[k],并且 b[k]=max(b[ j]), 1<=j<=i-1
所以:b[i]=b[k]+1.
如果存在k’, b[k’]>b[k] ,并且 a[i]>=a[k’],即
b[i]不是满足条件的最大值。这与定义矛盾。
因此, 该问题满足最优子结构性质。
用数组b[0:i]记录以a[i] (0≤i<n) 为结尾元素的最长递增子序列的长度。
序列a的最长递增子序列的长度为:max {b[i]}
显然,b[i]满足最优子结构性质,可以递归的定义为:
b[0] = 1;
b[i] = max {b[k]} + 1

即k在0~(i-1)范围内, 若a[k] ≤a[i], 寻找最大的b[k].
据此将计算b[i]转化为i个规模更小的子问题。
#define NUM 100
int a[NUM];      //序列L
int LIS_n2(int n)  {  
 int b[NUM]={0};   //辅助数组b
 int i,j;
 b[1] = 1; //以a[1]结尾的子序列中只包含一个元素
 int max = 0;     //数组b的最大值
 for (i=2;i<=n; i++) {
  int k = 0;
  for (j=1; j<i; j++)  //0~i-1之间,b的最大值
   if (a[j]<=a[i] && k<b[j]) k=b[j];
  b[i] = k+1;
  if (max<b[i])
max=b[i];
 }
 return max;
}

猜你喜欢

转载自blog.csdn.net/qq_45664943/article/details/102772150