题目:http://poj.org/problem?id=1276
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
#include <math.h>
#include <string>
#include <string.h>
#include <bitset>
#define INF 0xfffffff
#define MAXN 100105
using namespace std;
int cash,N;
int n[15],d[15];
int dp[100005];
int main(){
while(cin>>cash>>N){
for(int i = 0; i < N; i++)cin>>n[i]>>d[i];
memset(dp,0,sizeof(dp));
dp[0] = 1;
int max = 0,tmp;
for(int i = 0; i < N; i++){
for(int j = max; j >= 0; j--){
if(dp[j]==0)continue;
for(int k = 0; k <= n[i]; k++){
tmp = j + k*d[i];
if(tmp>cash)continue;
if(tmp>max)max = tmp;
dp[tmp] = 1;
}
}
}
cout<<max<<endl;
}
}
总结: 多重背包问题. dp[i]=1表示能凑出i的钱.