dp[i][j]代表前i个科目花费j天所能获得的最大的分。
可以写出状态转移方程:
dp[i][j]=max(dp[i][j],dp[i-1][j-k]+map[i][k]);
这里k从0循环至j。
比较简单。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n,m;
int map[105][105];
int dp[105];
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(int i=0;i<=m;i++)
map[i][0]=0;
for(int i=1;i<=n;i++)
{
map[i][0]=0;
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=m;j>=1;j--)
{
for(int k=j-1;k>=0;k--)
dp[j]=max(dp[j],dp[k]+map[i][j-k]);
}
}
int maxn=0;
for(int i=1;i<=m;i++)
maxn=max(maxn,dp[i]);
cout<<maxn<<endl;
}
return 0;
}