题解,也算是多重背包吧
W学长的零花钱
https://ac.nowcoder.com/acm/problem/24382
#include <iostream> using namespace std; int main() { int t, m, mon[3], kin[] = {1, 5, 10}, count = 0; ; bool can = false; cin >> t; for (int i = 0; i < t; i++) { can = false; count = 0; cin >> m >> mon[0] >> mon[1] >> mon[2]; for (int j = 2; j >= 0; j--) //多重背包,求最小,所以倒序遍历,因为最后的价值最大,所以需要的最小。 { for (int p = 0; p < mon[j]; p++) { if (m >= kin[j]) //如果价格高于当前价值,则减去,同时纸币加1 { m -= kin[j]; count++; } if (m == 0) //如果为零,则正好买到,标记为真,跳出循环 { can = true; break; } } if (m == 0) //第二层循环跳出 break; } if (can) cout << count << endl; else cout << -1 << endl; } }