c语言算法—背包问题进阶型(含有两个约束项)

原创 2017年03月28日 14:35:30

在之前的01背包问题中,我们可以发现约束项都只有一个,下面我们来探讨两个约束项的情况;

首先,我们考虑使用一维还是二维来表达:在有一个约束项时,我们需要二维,因为横向表示物品数,而竖向表示约束项的改变;所以我们发现,当有两个约束项的时候,不能再使用二维数组的方式了;

所以,我们决定使用一维数组;再考虑,一维数组时,用数组的下标来表示约束项的改变,那么当有两个约束项的时候,明显下标不够,那么什么能用来表示两个约束项呢?

那就是二维数组。它包含的两个下标,正好分别对应了每个约束项;

所以,经过这样的思维流程,我们可以发现,其实含有两个约束项的二维数组实质上是由一维数组的表达算法衍化而来;

那么,我们在书写代码的时候,就要注意了,最大的循环应该依旧是物体的个数,因为不管怎样,都要遍历完所有的物品,即:

for(int k=1;k<=n;++k)

然后我们需要对两个约束项的0-m都进行遍历,即:

for(int i=m1;i>=0;--i)
for(int j=m2;j>=0;--j)

因为此方式是由一维数组的放大衍化而来的,所以遍历的时候,只能逆序遍历;

然后,我们应该考虑到,每次进行更新的时候,不能只对一个约束项进行控制,而是两个一起考虑,所以if条件应该修改为:

if(j>=a[k]&&i>=b[k])

而在更新的时候,同样应该进行两项的下标更新:

f[i][j]=max(f[i][j],f[i-b[k]][j-a[k]]+c[k]);

此代码主要部分已差不多说完,上完整代码:

#include<stdio.h>
#include<malloc.h>
#define max(a,b) (a>b? a:b) 
int f[3000][3000];
int *a,*b,*c;
int main()
{
    int m,v,n;
    scanf("%d%d%d",&m,&v,&n);
    a=(int *)malloc(sizeof(int)*(n+1));
    b=(int *)malloc(sizeof(int)*(n+1));
    c=(int *)malloc(sizeof(int)*(n+1));
    for(int i=1;i<=n;++i)
    scanf("%d%d%d",&a[i],&b[i],&c[i]);
    for(int k=1;k<=n;++k)
    for(int i=v;i>=0;--i)
    for(int j=m;j>=0;--j)
    {
        if(j>=a[k]&&i>=b[k])
        f[i][j]=max(f[i][j],f[i-b[k]][j-a[k]]+c[k]); 
    }

    printf("%d",f[v][m]);
    return 0;
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

关于C++中cout的使用

控制cout格式化输出有三种方法, 1.使用ios类中的枚举变量 2.使用I/O控制符 3.使用ios类成员函数此处先介绍第二种,其他两种以后更新。在介绍I/O控制符之前,我先简单说一下endl...

遗传算法解决0-1背包问题

一:问题描述          给定n种物品,物品i(1≤i≥n)的体积为wi,价值为vi,将这n种物品放入容量为C的背包之中。在放入背包的物品总体积小于C的情况下,求放入背包物品的最大价值。  ...

c语言算法—01背包问题(基础型)

01背包问题在动态规划中很是常见,那就只简略概述一下背包问题:有一个背包,承重不能超过m千克,现有n件物品,都有其对应的质量与价值;要求在不超过最大承重的情况下,输出最大价值;解决这个问题的最基础方式...

遗传算法的0-1背包问题(c语言)

  • 2009年07月28日 15:35
  • 218KB
  • 下载

背包问题c语言实现算法

  • 2010年04月07日 13:05
  • 2KB
  • 下载

[算法]简单的背包问题递归解法,C语言实现

今天讲点简单的算法,最简单的背包0算法,使用了递归的方法,相信看完代码的朋友会发现这段代码很熟悉,不过CG提供这些代码的目的只是让全部背包算法的完整提供地给大家,代码很简单,相信高手一看就懂,这里的背...
  • yctccg
  • yctccg
  • 2016年08月16日 10:39
  • 1755

黑马程序员--C语言算法之01背包问题

0-1背包问题 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1);如果给你一个背包它能容纳的重量为m(10),你所要做的就是把物品装到背包里,使背包里...

[算法]背包问题的经典算法和贪心算法解答,C语言实现

圣诞前夜讲点比较具有圣诞感觉的算法,背包问题算法,这里我写了经典算法和贪心算法两种解决方法,因为时间不多,所以给出的数组是已经排序的,因为贪心算法可能要用得到,经典算法因为是一个一个比较,因此排序也就...
  • yctccg
  • yctccg
  • 2016年08月16日 10:38
  • 2611

0-1背包和背包问题(C语言实现)——贪心算法应用(3)

问题描述:           给定n种物品和一个背包。物品i的重量为w[i],其价值为v[i],背包的容量为c。应如何选择装入  背包的物品,使得装入背包中的物品的总价值最大。每种物品最多装入一次...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言算法—背包问题进阶型(含有两个约束项)
举报原因:
原因补充:

(最多只允许输入30个字)