注解
1、可用完全背包来做。
2、也可用哈希映射来做。
3、注意如果输入的数字小于150,应该直接输出该数字,因为什么都买不了。
代码(完全背包)
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 10010;
int dp[LEN];
void init(){
memset(dp, 0, sizeof(dp));
for(int i=0; i<150; i++){
dp[i] = i;
}
for(int i=151; i<200; i++){
dp[i] = dp[i-150];
}
for(int i=200; i<350; i++){
dp[i] = min(dp[i-150], dp[i-200]);
}
for(int i=350; i<LEN; i++){
int minn = min(dp[i-150], dp[i-200]);
minn = min(minn, dp[i-350]);
dp[i] = minn;
}
}
int main() {
init();
int T;
scanf("%d", &T);
for(int i=0; i<T; i++){
int N;
scanf("%d", &N);
printf("%d\n", dp[N]);
}
return 0;
}
代码(哈希映射)
#include <iostream>
#include <cstring>
using namespace std;
const int LEN = 10001;
int a[LEN];
void init(){
memset(a, 0, sizeof(a));
a[150] = 1;
a[200] = 1;
a[350] = 1;
for(int i=150; i<LEN; i++){
if(a[i]){
a[i+150] = 1;
a[i+200] = 1;
a[i+350] = 1;
}
}
}
int main() {
init();
int T;
scanf("%d", &T);
for(int i=0; i<T; i++){
int N;
scanf("%d", &N);
int ans = N;
for(int j=N; j>=0; j--){
if(a[j]){
ans = N-j;
break;
}
}
printf("%d\n", ans);
}
return 0;
}