nyoj 49 开心的小明 【DP】【01背包】

来源:互联网 发布:命令行更新ubuntu系统 编辑:程序博客网 时间:2024/04/28 01:34

网上的讲解很详细 不再解释 

 代码一:(二维数组)


#include<stdio.h>#include<string.h>#define max( a, b ) a>b?a:bint dp[30][30005];int main(){int t, n, m, i, j, v[30], p[30];scanf( "%d", &t );while( t -- ){scanf( "%d%d", &n, &m );for( i = 0; i < m; i ++ )scanf( "%d%d", &v[i], &p[i] );memset( dp, 0, sizeof(0) );for( i = 0; i < m; i ++ ){for( j = 0; j <= n; j ++ )if( j < v[i] ) dp[i+1][j] = dp[i][j];elsedp[i+1][j] = max( dp[i][j], dp[i][j-v[i]]+v[i]*p[i] );}printf( "%d\n", dp[m][n] );}return 0;}
代码二:(一维数组)

#include<stdio.h>#include<string.h>#define max( a, b ) a>b?a:bint dp[30005];int main(){int t, n, m, i, j, v[30], p[30];scanf( "%d", &t );while( t -- ){scanf( "%d%d", &n, &m );for( i = 0; i < m; i ++ )scanf( "%d%d", &v[i], &p[i] );memset( dp, 0, sizeof(dp) );for( i = 0; i < m; i ++ ){for( j = n; j >= v[i]; j -- )dp[j] = max( dp[j], dp[j-v[i]]+v[i]*p[i] );}printf( "%d\n", dp[n] );}return 0;}



0 0
原创粉丝点击