01背包
class Solution {
public:
const int inf = 0x3f3f3f3f;
int minMoney(vector<int>& arr, int aim) {
int n = arr.size();
int dp[aim + 1];
memset(dp, inf, sizeof(dp));
dp[0] = 0;
for(int i = 0; i < n; i ++){
for(int v = arr[i]; v <= aim; v ++){
dp[v] = min(dp[v], dp[v - arr[i]] + 1);
}
}
return dp[aim] == inf ? -1 : dp[aim];
}
}; 记录具体选择
class Solution {
public:
const int inf = 0x3f3f3f3f;
int minMoney(vector<int>& arr, int aim) {
int n = arr.size();
int dp[n + 1][aim + 1];
int choose[n + 1][aim + 1];
memset(dp, inf, sizeof(dp));
memset(choose, -1, sizeof(choose));
dp[0][0] = 0;
for(int i = 1; i <= n; i ++){
for(int v = 0; v <= aim; v ++){
if(v < arr[i - 1]) dp[i][v] = dp[i - 1][v];
else{
if(dp[i - 1][v] > dp[i][v - arr[i - 1]] + 1){
dp[i][v] = dp[i][v - arr[i - 1]] + 1;
choose[i][v] = i;
}else dp[i][v] = dp[i - 1][v];
}
}
}
if(dp[n][aim] == inf) return -1;
int i = n, v = aim;
vector<int> res;
while(i > 0){
cout << i << ":" << v << ":" << choose[i][v] << " ";
if(choose[i][v] != -1){
i = choose[i][v];
v -= arr[i - 1];
res.push_back(arr[i - 1]);
}else i --;
}
cout << endl;
for(int i = 0; i < res.size(); i ++) cout << res[i] << " ";
return dp[n][aim] == inf ? -1 : dp[n][aim];
}
}; 
京公网安备 11010502036488号