HDU 1712 裸分组dp

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

N门课M天复习,第i门课花费j天获得的效益是dp[i][j]

求最大效益

分组背包,同一门课不能选两次

三层循环

第一层:几个分组循环

第二层:总容量递减

第三层:抉择构成背包

dp[j]=max(dp[j],dp[j-c[k]]+w[k]);(其中c[k]为k物品的费用,w[k]为价值),由于递降枚举背包容量,max比较中的dp[j]是由上一组物品决策所得,在这里将被忽略。就算不忽略,在本组物品中dp[j]的决策依然要取决于dp[j-c[k]]+w[k]。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[105][105],m,n,f[105];
int max(int a,int b)
{
    if(a>=b){return a;}
    return b;
}
void rec()
{
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=0;j--)
        {
            for(int k=1;k<=j;k++)
            {
                f[j]=max(f[j],f[j-k]+dp[i][k]);
            }
        }
    }
    cout<<f[m]<<endl;
}
int main()
{
    int i,j;
    while(cin>>n>>m&&n&&m)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                cin>>dp[i][j];
            }
        }
        rec();
        memset(dp,0,sizeof(dp));
    }
    return 0;    
}
原文地址:https://www.cnblogs.com/dzzy/p/5354735.html