poj 1276 多重背包

#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; }
posted @ 2014-08-18 10:20  2014acm  阅读(227)  评论(0编辑  收藏  举报