1276 Cash Machine
多重背包模板题
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int N, c;
int n[15], d[15];
int dp[100005];
void ZeroOnePack(int use){
for(int v = c; v >= use; --v){
if(dp[v] < dp[v-use]+use){
dp[v] = dp[v-use]+use;
}
}
}
void CompletePack(int use){
for(int v = use; v <= c; ++v){
if(dp[v] < dp[v-use]+use){
dp[v] = dp[v-use]+use;
}
}
}
void MultiPack(){
for(int i = 1; i <= N; ++i){
if(d[i]>c){
continue;
}
if(d[i]*n[i]>=c){
CompletePack(d[i]);
}
else {
int k = 1, temp = n[i];
while(k<temp){
ZeroOnePack(k*d[i]);
temp -= k;
k<<=1;
}
ZeroOnePack(temp*d[i]);
}
}
printf("%d\n", dp[c]);
}
int main(){
while(scanf("%d %d", &c, &N)!=EOF){
for(int i = 1; i <= N; ++i){
scanf("%d %d", &n[i], &d[i]);
}
memset(dp, 0, sizeof(dp));
MultiPack();
}
return 0;
}