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;
} 
版权声明:本文为博主原创文章,未经博主允许不得转载。

限定条件不止一种的背包问题

对于正常的背包问题,只有一个限定条件——背包容量不超过多少,而有些背包问题有多重限定条件,比如NASA的食物计划这道题,有体积和质量这两个限定条件。 对于这种问题,其实是和正常的背包问题是差不多的,...
  • kyriesnow
  • kyriesnow
  • 2015年03月14日 09:45
  • 610

01背包问题和完全背包问题

在hihocoder上面两期的题目,一个01背包问题,一个完全背包问题。总结一下!...
  • KangRoger
  • KangRoger
  • 2014年08月27日 10:27
  • 51182

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

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

hdu5188 加限制的01背包问题

http://acm.hdu.edu.cn/showproblem.php?pid=5188 Problem Description As one of the most po...
  • u013573047
  • u013573047
  • 2015年03月16日 20:39
  • 889

背包问题详解:01背包、完全背包、多重背包

参考链接: http://www.cnblogs.com/fengty90/p/3768845.html http://blog.csdn.net/mu399/article/details/7722...
  • na_beginning
  • na_beginning
  • 2017年03月17日 11:47
  • 2068

背包问题之两个例题:Inflate & Building

Problem #1:Inflate Description 设计一次竞赛使得选手最大可能的得分尽可能高。可供选择的题目共有N类(1 Input Format 第一行两个整数M, N分别表示竞赛总时...
  • HAG_blank
  • HAG_blank
  • 2016年11月01日 17:38
  • 301

贪心算法解决背包问题

问题重述: 与0-1背包问题类似,所不同的是,在选择物品i装入背包的时候,可以选择物品i的一部分装入背包,而不一定全部装入背包,这是与0-1背包问题的差别。形式化描述语言:给定背包容量c(c>0),和...
  • u013084907
  • u013084907
  • 2015年12月08日 20:34
  • 7191

01背包问题--C语言代码

01背包问题的c语言代码
  • xuqi7
  • xuqi7
  • 2017年05月18日 17:43
  • 614

【DP算法篇之初学】背包问题

昨天做了爱奇艺的内推笔试,编程题又出现了动态规划问题,感觉动态规划出现的概率好大,需要加强下。这里借用背包问题开始我们的学习。 背包问题的经典讲解可以参见背包问题九讲,此外我在刷题的过程中发现还发...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年08月31日 10:13
  • 3629

0-1背包问题的两种动态规划算法思想

动态规划有两种基本思路,一种是自顶而下的备忘录算法,一种思路是自底向上的动态规划算法。...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2017年03月22日 08:52
  • 1588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言算法—背包问题进阶型(含有两个约束项)
举报原因:
原因补充:

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