zoukankan      html  css  js  c++  java
  • HDU-1712-ACboy needs your help

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1712

    题意

    给你一个n*m的矩阵,行代表第i门课程,列代表修这门课程要花的时间天数,矩阵值代表得到的效益。

    做这题,刚好在看分组背包,直接用分组背包A了,一个分组背包的裸题,

    何谓分组背包:转自背包九讲

    N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

    算法

    这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:

    f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k}

    使用一维数组的伪代码如下:

    for 所有的组k
        for v=V..0
            for 所有的i属于组k
                f[v]=max{f[v],f[v-c[i]]+w[i]}


    代码

    /*for 所有的组k
    for v=V..0
    for 所有的i属于组k
    f[v]=max{f[v],f[v-c[i]]+w[i]}

    */

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;


    int main(void)
    {
    int i,j,k,n,m;
    int matrix[110][110];
    int f[110];
    while(scanf("%d%d",&n,&m)==2&&(n+m))
    {
    memset(f,0,sizeof(f));
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
    {
    scanf("%d",&matrix[i][j]);
    }
    }
    for(i=1;i<=n;i++)
    {
    for(j=m;j>=0;j--)
    {
    for(k=1;k<=m&&k<=j;k++)
    {
    f[j]=max(f[j],f[j-k]+matrix[i][k]);
    //printf("%d ",f[j]);
    }
    }
    }
    printf("%d ",f[m]);
    }
    return 0;
    }




  • 相关阅读:
    Python 写入和读取Excel数据
    postman检查点详解
    禅道安装在不同系统下搭建步骤
    Linux下如何启动和关闭防火墙
    tomcat环境搭建
    Lniux下搭建LNMP环境
    Linux下搭建LAMP环境
    通过XAMPP导入WordPress网站建立个人博客
    在Windows下XAMPP的安装及使用教程
    linux 下安装配置xampp环境
  • 原文地址:https://www.cnblogs.com/liudehao/p/4139773.html
Copyright © 2011-2022 走看看