M M M天学 N N N门课,第 i i i门课学 j j j天获得收益 A [ i ] [ j ] A[i][j] A[i][j]。求最大收益?
N , M ≤ 100 N,M\le 100 N,M≤100
转化:容积为
M
M
M,拆一万件物品来01背包…
分组背包搞就行了。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
int N,M;
int Aij[105][105]={};
int F[105]={};
int main()
{
while(~scanf("%d%d",&N,&M))
{
if(N==0)return 0;
memset(F,0,sizeof(F));
for(int i=1;i<=N;++i)
for(int j=1;j<=M;++j)
scanf("%d",&Aij[i][j]);
for(int i=1;i<=N;++i) //第i门课
for(int k=M;k>=0;--k) //容积k
for(int j=1;j<=k;++j) //学j天
F[k]=max(F[k],F[k-j]+Aij[i][j]);
//这样循环能够满足一门课只选择学某一种天数
printf("%d\n",F[M]);
}
return 0;
}