hdu1712 ACboy needs your help

题意:

有个ACboy有这学期有N门课要学,他打算最多花M天去学习,当然,他的收益决定于他在课程上花的天数

输入:

2 2

1 2

1 3

课程编号为1,2,,,N

每个样例的第一行为n,m接下来为n*m的矩阵a,a[i][j]表示在i课程上花j天的收益

解法:

分组的背包问题,做法详见背包九讲,写的时候先将每个组看成一个整体,化为01背包,然后再加入组的成员

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int profit[110][110];//profti[i][j]表示花j天在i课上的收益
int d[110];
int main()
{
	int n,m;
	while(cin>>n>>m,n||m)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>profit[i][j];
			}
		}
		//
		memset(d,0,sizeof(d));
		for(int i=1;i<=n;i++)
		{
			for(int j=m;j>=1;j--)
			{
				for(int k=1;k<=m;k++)
				{
					if(j-k<0)
					{
						continue;
					}
					if(d[j]<d[j-k]+profit[i][k])
					{
						d[j]=d[j-k]+profit[i][k];//状态转移方程
					}
				}
			}
		}
		cout<<d[m]<<endl;
	}
	return 0;
}


你可能感兴趣的:(hdu1712 ACboy needs your help)