0-1背包:
n道数学题分值为A[I] A[2] A[3].....A[N] 1<=A[i]<=100
求怎么拼凑得到100分,一共需要多少道题目,分别是哪些题目
输入:3 10 30 60 输出:3 1 2 3
int main(){
int n = 0;
while (cin >> n&&n>0){
vector<int> score(n, 0);
for (int i = 0; i < n; ++i){
cin >> score[i];
}
vector<int> dp(101, -1);//存放的是当前分值下最后一次放入的题目的编号
for (int i = 0; i < n; ++i){
for (int j = 100; j >= score[i]; --j){
if (j == score[i])
dp[j] = i;
else if (dp[j - score[i]] != -1){
dp[j] = i;
}
}
}
int sum = 100;
vector<int> result;
while (dp[sum] != -1){//回溯得到所有题目的编号
result.push_back(dp[sum]);
sum -= score[dp[sum]];
}
cout << result.size() << endl;
for (int i = result.size() - 1; i >= 0; --i){
cout << result[i] +