嗯...
题目链接:https://www.luogu.org/problemnew/show/P2925
这是一道简单的01背包问题,但是按照正常的01背包来做会TLE一个点,所以要加一个特判(见代码)。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 int v[50005], dp[50005]; 7 8 int main(){ 9 int c, h; 10 scanf("%d%d", &c, &h); 11 for(int i = 1; i <= h; i++) 12 scanf("%d", &v[i]); 13 for(int i = 1; i <= h; i++){ 14 for(int j = c; j >= v[i]; j--){ 15 dp[j] = max(dp[j], dp[j - v[i]] + v[i]); 16 if(dp[j] == c){ 17 printf("%d", c); 18 return 0; 19 }//特判 20 } 21 } 22 printf("%d ", dp[c]); 23 return 0; 24 }