#include <iostream>
using namespace std; int cash, n, m[13], d[13]; int f[100100]; int money, i, v, temp, k; int solve() { memset(f, 0, sizeof(f)); // 标记数组 全部为0 money = 0; f[0] = 1;
//价值为0 肯定 可以用硬币 构造出来 ,,,,标记为 1
for (i=1; i <= n; i++) { // 物品种类 for (v=cash; v >=0; v--) { //背包容量(体积)
if (f[v]) {
for (k=1; k <= m[i]; k++) { temp = v + k*d[i]; if (temp > cash) break; if (temp > money) money = temp; // 实际情况 不能构造出来 但money尽可能的 接近 f[temp] = 1; //能构造出来 标记为1 }
} } } return money; } int main() { while (scanf("%d %d", &cash, &n) != EOF) { for (i=1; i <= n; i++) { scanf("%d %d", &m[i], &d[i]); } printf("%d\n", solve()); } return 0; }
转载于:https://www.cnblogs.com/2014acm/p/3918929.html