hdu 1712 (分组背包)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17676

 

这个问题让我对分组背包更清晰了一点,主要是这个问题:

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

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

注意这里的三层循环的顺序,甚至在本文的第一个beta版中我自己都写错了。“for v=V..0”这一层循环必须在“for 所有的i属于组k”之外。这样才能保证每一组内的物品最多只有一个会被添加到背包中。

 

--背包九讲

 

这里的顺序问题已经有理解了

 

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 1010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f

int n,m;

int mapp[105][105];

int dp[105];

int main()
{
    int i,j,k;
    while(~sf("%d%d",&n,&m) && m+n)
    {
        mem(dp,0);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                sf("%d",&mapp[i][j]);
            }
        }

        for(i = 0;i<n;i++)
        {
            for(j=m;j>=0;j--)
            {
                for(k=0;k<m;k++)
                {
                    if(k+1<=j)
                        dp[j] = max(dp[j],dp[j-(k+1)]+mapp[i][k]);
                }
            }
        }
        pf("%d\n",dp[m]);
    }
    return 0;
}

 

posted @ 2016-07-04 16:24  qlky  阅读(167)  评论(0编辑  收藏  举报