【解题报告】[动态规划]RQNOJ PID2 / 开心的金明
时间:2014-04-27 21:26:22
收藏:0
阅读:537
原题地址:http://www.rqnoj.cn/problem/2
解题思路:背包问题。
状态转移方程:DP[i][j]=max(DP[i-v[j]][j-1]+p[j]*v[j],DP[i][j-1])
DP[i][j]表示最多话费i的钱,购买前j+1个物品所能达到的最大价值。
解题代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 int DP[30005][25]; 6 int v[25]; 7 int p[25]; 8 int main() 9 { 10 int n,m,i,j; 11 scanf("%d%d",&n,&m); 12 for(i=0;i<m;i++) 13 { 14 scanf("%d%d",&v[i],&p[i]); 15 } 16 for(i=0;i<=n;i++) 17 { 18 if(i>=v[0]) DP[i][0]=v[0]*p[0]; 19 else DP[i][0]=0; 20 } 21 for(j=1;j<m;j++) 22 { 23 for(i=0;i<=n;i++) 24 { 25 if(i>=v[j]) DP[i][j]=max(DP[i-v[j]][j-1]+p[j]*v[j],DP[i][j-1]); 26 else DP[i][j]=DP[i][j-1]; 27 //if(DP[i][j]>=3900) {printf("dp[%d][%d]=%d\n",i,j,DP[i][j]);getchar();} 28 } 29 } 30 printf("%d\n",DP[n][m-1]); 31 return 0; 32 }
评论(0)