原题地址: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 }
【解题报告】[动态规划]RQNOJ PID2 / 开心的金明,码迷,mamicode.com
时间: 2024-12-14 18:06:46