前几天对这题编了码。自己本地都跑不过。罢了,谁叫我不会做呢= =。
今天被树形DP虐了,没想法了= =。回头准备切切这题。分析了一下特点:
总共要学习N天,每门课程学习的天数都有不同的价值。在每门课程中只能选择一个指定的天数来学。
Wait!!! 怎么感觉好像分组背包的描述!
背包容量为要学习的N天,每门课程为一个分组,分组中每个物品的代价是学分,花费是学习的天数。
而分组背包为:在每个分组中至多选择一个,求最大值。LeeeeeNiang!这不是分组背包么!!!
敲之交之,AC.带感!
学习DP有5天了啊。收获还是不错的,虽然不管什么题,每天固定3道,突破不了也少不了= =。26/3=8天,还要切三天啊... 悲催.....
#include<iostream> #include<string> #include<string> using namespace std; int main() { int N,M; int A[111][111]; int f[111]; while( scanf( "%d %d",&N,&M ),N||M ) { memset( f,0,sizeof(f) ); for( int i=1;i<=N;i++ ) for( int j=1;j<=M;j++ ) scanf( "%d",&A[i][j] ); for( int i=1;i<=N;i++ ) for( int v=M;v>=1;v-- ) for( int j=1;j<=M;j++ ) if( v-j>=0 ) f[v]=max( f[v],f[v-j]+A[i][j] ); printf( "%d\n",f[M] ); } return 0; }