Julian Draxler opened the scoring for Schalke in the 30th minute before Claudio Pizarro equalised in the 42nd minute from the spot. Huntelaar scored in the 65th and 74th minute to give Schalke a 3-1 lead, which Pizarro cut to 3-2 in the 82nd minute.
Schalke had already secured third place in the Bundesliga and a direct spot in the Champions League next season. But Huntelaar's 28th and 29th goals gave him the scoring crown ahead of Bayern Munich's Mario Gomez, who had 26 scores this season.
Bremen slumped to ninth in the league with 42 points.
Bremen had the first chance after 17 minutes from a corner which Sokratis headed to Pizarro, whose shot went just wide.
Schalke took over the run of play and went ahead at the half hour-mark with Draxler and Huntelaar playing a give-and-go before Draxler blasted past Werder keeper Tim Wiese from 16 yards.
Wiese kept his team in the game five minutes later with a fine save one-on-one against Huntelaar.
Bremen equalised in the 42nd minute from the spot as Pizarro converted into the lower right corner after Sergio Escudero was ruled to have taken down Aaron Hunt in the box.
Bremen nearly went into the changing room ahead 2-1 but Schalke keeper Lars Unnerstall made a superb save a minute into first-half stoppage time.
Unnerstall made a fine stop in the 57th minute against Markus Rosenberg and Wiese matched it two minutes later against Draxler.
But Huntelaar beat Wiese in the 65th minute for the 2-1 lead as the Dutchman first found the left post but struck home the rebound.
And Huntelaar scored again nine minutes later on a counter attack, beating Wiese one-on-one.
Pizarro tried to make things interesting with his second goal of the contest in the 82nd minute, heading in Hunt's cross.