码迷,mamicode.com
首页 > 其他好文 > 详细

分组背包模板题 hdu1712

时间:2018-11-03 21:58:18      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:detail   ios   nbsp   声明   价值   单位   std   col   set   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712

第一次接触分组背包,参考博客:https://blog.csdn.net/yu121380/article/details/81387879

什么都要自己写一遍。

对于k组物品,每个物品都有一个需要花费的容量值和一个价值,并且对于同一组里面的物品最多只可以拿一个,现在有m个单位的容量,问在不超出最大容量的情况下可以得到的最大的价值。

思路:我们声明一个二维数组,dp[k][j]表示前k组花费j容量时可以得到的最大价值。对于每一组的每一个物品都有两种选择(选与不选),即dp[k][j]=max(dp[k-1][j],dp[k-1][j-w[i]]+v[i]);如果dp[k][j]=dp[k-1][j]就是第k组的第i个物品不取,值直接从前一组的答案赋过来,如果dp[k][j]=dp[k-1][j-w[i]]+v[i],那么就是取第k组的第i个物品。

代码:

for(int k=1;k<=K;k++){//枚举k组物品 

    for(int j=1;j<=N;j++){//计算花费j容量时可以得到的最大价值,
                        //每个物品只能拿一次,因为是二维数组,所以是顺着写,如果是一维就要逆着写  
                        
        for(int i=1;i<=num[i];i++){//枚举第k组里面的每一个物品,因为每一组物品最多只可以拿一个
                            //所以这个循环要写在最里面 
            if(j>=w[i])                
            dp[k][j]=max(dp[k-1][j],dp[k-1][j-w[i]]+v[i]);
            //在这第三层循环里面我只改变了dp[k][j]的值 
            //而这个改变的值是因为从第k组物品里面拿了一个(当然可能这一组都没拿,只是上一组的值拿过来了)
            //上面这一步就是在选择到底该拿哪一个 
        }
    }
} 

 

 

hdu1712题意,第一行给出两个数字n和m,表示一共有n门学科和m天的时间,接下来给出一个n*m的矩阵,矩阵里面的元素v[i][j]表示第i门学科学习j天的收益,每天只可以学习一门学科,现在问在m天的时间里面学习这n门学科可以得到的最大收益是多少。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque> 
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 10005
int dp[maxn],v[105][105];//用一维数组来写分组背包,v[i][j]表示第i组占容量为j的物品的价值 
int n,m,k,t;
int main()
{
    while(scanf("%d%d",&n,&m)&&n&&m)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&v[i][j]);
            }
        }
        for(int k=1;k<=n;k++){//枚举k组物品 
            for(int i=m;i>=0;i--){//枚举容量,因为是一维写,并且物品只能拿一次,所以要倒着遍历
                for(int j=1;j<=m;j++){//第k组物品里的m个物品里面选择一个,
                    if(i>=j)
                    dp[i]=max(dp[i],dp[i-j]+v[k][j]);
                }
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}

 

分组背包模板题 hdu1712

标签:detail   ios   nbsp   声明   价值   单位   std   col   set   

原文地址:https://www.cnblogs.com/6262369sss/p/9902141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!