2 900 250
0 50
这个题首先的思路是DP,没想到贪心就可以做啦,这个题的题目信息出的比较巧妙
AC代码(DP):
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[10005];//dp[i]表示背包容量为i时最多可以用到的容量 int val[3] = {150, 200, 350}; int main() { int T, N; scanf("%d", &T); while(T--) { scanf("%d", &N); memset(dp, 0, sizeof(dp)); for(int i = 0; i < 3 ; i++) for(int j = val[i]; j <= N; j++) dp[j] = max(dp[j], dp[j - val[i]] + val[i]); printf("%d\n", N - dp[N]); } return 0; }
AC代码(贪心):
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main() { int T; cin >> T; while(T--) { int N, ans; cin >> N; if(N < 150) ans = N; else if(N >= 150 && N < 200) ans = N - 150; else if(N >= 200 && N < 300) ans = N - 200; else if(N >= 300) ans = N % 50; printf("%d\n", ans); } return 0; }