输入的第一行有两个整数C(1 <= C <= 1000)和N(1 <= N <= 100),C代表总共能够报销的额度,N>代表能点菜的数目。接下来的N行每行包括两个在1到100之间(包括1和100)的的整数,分别表示菜的>价格和菜的评价分数。
输出只包括一行,这一行只包含一个整数,表示在报销额度范围内,所点的菜得到的最大评价分数。
90 4 20 25 30 20 40 50 10 18 40 2 25 30 10 8
95 38
#include <stdio.h> struct goods{ int price; int value; }; int main(){ int dp[101][1001] = {0}; int c, n; struct goods a[101]; scanf("%d%d", &c, &n); for (int i = 1; i <= n; i ++) { scanf("%d%d", &a[i].price, &a[i].value); } for(int i = 1;i <= n; i ++){ for (int j = 1; j <= c; j ++) { int t1 = dp[i-1][j]; int t2 = 0; if (j-a[i].price>=0) { t2 = dp[i-1][j-a[i].price]+a[i].value; } dp[i][j] = t1>t2?t1:t2; } } printf("%d", dp[n][c]); return 0; }