题目分析:有n门课程,A[i][j]表示第i们课程,用j天完成,可以得到的价值,用m天可以得到的最大价值;
把每一行当做一组物品,时间耗时当做体积,m天当做容量,
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1712
#include<iostream>
#include<cstdio>
using namespace std;
int dp[10000],A[110][110];
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&A[i][j]);
memset(dp,0,sizeof(dp));
for(int k=1;k<=n;k++)//每一组
for(int j=m;j>=0;j--)//代价
for(int i=1;i<=m;i++)
if(j-i>=0)
dp[j]=max(dp[j],dp[j-i]+A[k][i]);
printf("%d\n",dp[m]);
}
system("pause");
return 0;
}
另一种:
#include<iostream>
#include<cstdio>
using namespace std;
int dp[10000],A[110][110];
int main()
{
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&A[i][j]);
memset(dp,0,sizeof(dp));
for(int k=1;k<=n;k++)//每一组
for(int j=m;j>=0;j--)//代价
for(int i=1;i<=j;i++)
dp[j]=max(dp[j],dp[j-i]+A[k][i]);
printf("%d\n",dp[m]);
}
system("pause");
return 0;
}