题目大意:有n门课程和m天可以上课,每门课程上不同的天数有不同的收益,问m天最多可以获得多少收益
思路:我们用dp[j]表示上了j天的收益,对于第i门课程,可以选择不上,dp[j]就等于dp[j],或者我们枚举要上的天数,上k天的收益从k天前转移到j,dp[j]=dp[j-k]+a[i][j],对于每门课程的花费天数k,直接两种方案取最大值即可
- #include
- #include
- using namespace std;
- const int N = 105;
- int a[N][N], dp[N];
- int main()
- {
- int n, m;
- while (~scanf("%d%d", &n, &m),n&&m)
- {
- for (int i = 1; i <= m; i++)
- {
- dp[i] = 0;//要求最大值,初始化为0
- }
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= m; j++)
- {
- scanf_s("%d", &a[i][j]);
- }
- }
- for (int i = 1; i <= n; i++)
- {//枚举每个课程
- for (int j = m; j >= 0; j--)
- {//01背包问题倒推
- for (int k = 1; k <= j; k++)
- {
- dp[j] = max(dp[j], dp[j - k] + a[i][k]);//状态转移
- }
- }
- }
- printf("%d\n", dp[m]);
- }
- return 0;
- }