int INF = -(1<<30);
// 记忆化搜索
min[0] = 0;
int dp(int i) {
if(maxv[i] != -1)
return maxv[i];
maxv[i] = -INF;
for(int j = 1; j <= n; j++)
if(i >= V[j])
maxv[i] = max(maxv[i], dp(i-V[j]) + 1);
return maxv[i];
}
printf("%d\n", dp[S]);
// 递推
maxv[0] = 0;
for(int i = 1; i <= S; i++) {
maxv[i] = -INF;
}
for(int i = 1; i <= S; i++)
for(int j = 1; j <= n; j++)
if(i >= V[j])
maxv[i] = max(maxv[i], maxv[i-V[j]] + 1);
// 上面这条语句相当于
//if(maxv[i] < maxv[i-V[j]] + 1) {
// maxv[i] = maxv[i-V[j]] + 1;
}
printf("%d\n", maxv[S]);
void print_ans(int* maxv, int S) {
for(int j = 1; j <= n; j++)
if(S >= V[j] && maxv[S] == maxv[S-V[j]] + 1) {
printf("%d ", j);
print_ans(maxv, S-V[j]);
break;
}
}
// 递推 2
maxv[0] = 0;
for(int i = 1; i <= S; i++) {
maxv[i] = -INF;
}
for(int i = 1; i <= S; i++)
for(int j = 1; j <= n; j++)
if(i >= V[j]) {
if(maxv[i] < maxv[i-V[j]] + 1) {
maxv[i] = maxv[i-V[j]] + 1;
max_coin[i] = j;
}
}
void print_ans(int* max_coin, int S) {
while(S) {
printf("%d ", max_coin[S]);
S -= V[max_coin[S]];
}
}