背包问题扩展

背包问题学习链接:

http://blog.csdn.net/kangroger/article/details/38864689

代码:

#include <stdio.h>
#include <string.h>
int invest[301][21];
int total_invest;
int company_num;
int max[301];

int main(void)
{
    int tc, T;

    freopen("input.txt", "r", stdin);

    setbuf(stdout, NULL);

    scanf("%d", &T);
    for(tc = 0; tc < T; tc++)
    {
        total_invest = 0;
        company_num = 0;

        memset(max, 0, sizeof(max));

        scanf("%d %d",&total_invest,&company_num);

        int i,j,k;

        for(i=1;i<=total_invest;i++)
        {
            for(j=0;j<=company_num;j++)
            {
                scanf("%d",&invest[i][j]);
            }
        }

        for(j=1;j<=company_num;j++)
        {
            for(i=total_invest;i>=1;i--)
            {
                int tmp = -1;

                for(k=1;k<=i;k++)
                {
                    if(invest[k][j] + max[i-k] > max[i])
                    {
                        max[i] = invest[k][j] + max[i-k];
                    }
                }
            }

        }

        printf("%d\n",max[total_invest]);        

    }

    return 0;//Your program should return 0 on normal termination.
}

测试数据:

5
4 2
1 3 3
2 4 4
3 7 6
4 8 8
7 2
1 3 3
2 4 4
3 7 6
4 8 8
5 10 10
6 13 13
7 15 15
5 3
1 4 4 3
2 6 7 6
3 8 8 9
4 13 13 13
5 15 14 15
10 3
1 4 4 3
2 6 7 6
3 8 8 9
4 13 13 13
5 15 14 15
6 19 18 19
7 20 20 20
8 23 25 23
9 27 27 26
10 31 31 31
5 5
1 3 4 6 2 6
2 11 10 10 9 11
3 12 12 13 14 13
4 18 17 19 19 18
5 23 26 24 25 24

测试结果:

10
16
17
33
28
时间: 2024-10-12 01:39:21

背包问题扩展的相关文章

如何理解背包问题

问题 假定背包的最大容量为W,N件物品,每件物品都有自己的价值和重量,将物品放入背包中使得背包内物品的总价值最大.   背包问题wiki 可以想象这样一个场景--小偷在屋子里偷东西,他带着一只背包.屋子里物品数量有限--每件物品都具有一定的重量和价值--珠宝重量轻但价值高,桌 子重但价值低.最重要的是小偷背包容量有限.很明显,他不能把桌子分成两份或者带走珠宝的3/4.对于一件物品他只能选择带走或者不带走. 示例: Knapsack Max weight : W = 10 (units) Tota

贪心算法之背包问题

贪婪算法的基本思想:通过一系列步骤来构造问题的解,每一步都是对已构造的部分解的一个扩展,直到获得问题的完整解. 贪婪算法中,每一步“贪婪地” 选择最好的部分解,但不顾及这样选择对整体的影响(局部最优),因此得到的全局解不一定最好的解,但对许多问题它能产生整体最优解. 具体算法描述: public static void Greedy()        {            float cu = c;            int temp = 0;            int i = 0;

【转】经典算法:背包问题

本文由 ImportNew - hejiani 翻译自 javacodegeeks.欢迎加入Java小组.转载请参见文章末尾的要求. 背包问题很有意思,同时也富有挑战性.首先看一下这个问题的完整描述: 问题 假定背包的最大容量为W,N件物品,每件物品都有自己的价值和重量,将物品放入背包中使得背包内物品的总价值最大. 背包问题wiki 可以想象这样一个场景——小偷在屋子里偷东西,他带着一只背包.屋子里物品数量有限——每件物品都具有一定的重量和价值——珠宝重量轻但价值高,桌子重但价值低.最重要的是小

背包问题详解

01背包 一个背包中容量为V,现在有N个物品,每个物品的第i个 物品体积为weight[i],价值为value[i],现在往背包里面装东西,怎么装能使背包的内物品价值最大?这是01背包的最基础最根本的问题.01代表的意思是该物品取或者不取.顺便提一下各种背包之间的区别,完全背包每种物品的数目是无限种,多重背包的每种物品数目是有限中. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[

有依赖的背包问题(背包九讲)

问题: 这种背包问题的物品间存在某种"依赖"的关系.也就是说,i依赖于j,表示若选物品i,则必须选物品j.为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖:另外,没有某件物品同时依赖多件物品. 算法: 这个问题由NOIP2006金明的预算方案一题扩展而来.遵从该题的提法,将不依赖于别的物品的物品称为"主件",依赖于某主件的物品称为"附件".由这个问题的简化条件可知所有的物品由若干主件和依赖于每个主件的一个附件集合组成.按照背

二维费用背包问题(背包九讲)

------------------------------------------ 前言: 对于一些背包问题,重点还是在于如何找出"背包容量"和"各种代价",以及价值,如此问题便迎刃而解了.下午 打篮球居然下冰雹了,悲催了.... ------------------------------------------ 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有 一个可付出的最大值(背包容量)

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所

完全背包问题理解(转)

转自: http://blog.csdn.net/insistgogo/article/details/11081025 摘自Tianyi Cui童鞋的<背包问题九讲>,稍作修改,方便理解. 本文包含的内容: <1> 问题描述 <2> 基本思路(直接扩展01背包的方程) <3> 转换为01背包问题求解(直接利用01背包) <4> O(VN)的算法 --------------------------------------------- 1.问题

背包问题九讲(+自己的笔记)

************************************************************ 注意,红色带部分,着重理解 并且将不定期更新,主要是增加一些自己的理解. 这是一个共同学习的过程 欢迎一起. ************************************************************  背包问题九讲 目录 第一讲 01背包问题 第二讲完全背包问题 第三讲多重背包问题 第四讲混合三种背包问题 第五讲二维费用的背包问题 第六讲分