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;
    }




  • 相关阅读:
    C++ 黑白棋AI minimax+alphabeta剪枝
    BZOJ2839 集合计数 容斥
    BZOJ2287 消失之物
    CF235B Let's Play Osu! 期望DP
    线性基
    [HAOI2008]糖果传递 结论题
    [HAOI2007]上升序列
    线性筛及线性递推欧拉函数
    Codeforces 1064D/1063B Labyrinth
    洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP
  • 原文地址:https://www.cnblogs.com/liudehao/p/4139773.html
Copyright © 2011-2022 走看看