poj_1276

来源:互联网 发布:国外域名注册 支付宝 编辑:程序博客网 时间:2024/06/06 01:30
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define MAXV    200001#define MAXN    11int dp[MAXV], val[MAXN], cnt[MAXN];void zero_one_knapsack(int max_v, int v){        for(int i = max_v; i >= v; i --) {                if( dp[i-v] ) {                        dp[i] = 1;                }        }}void complete_knapsack(int max_v, int v){        for(int i = 0; i <= max_v-v; i ++) {                if( dp[i] ) {                        dp[i+v] = 1;                }        }}int knapsack(int max_v, int n){        int binary, tot;        memset(dp, 0, sizeof(dp)); dp[0] = 1;        for(int i = 0; i < n; i ++) {                if( val[i]*cnt[i] >= max_v ) {                        complete_knapsack(max_v, val[i]);                }                else {                        binary = 1;     tot = cnt[i];                        while( binary < tot ) {                                zero_one_knapsack(max_v, val[i]*binary);                                tot -= binary;  binary <<= 1;                        }                        zero_one_knapsack(max_v, tot*val[i]);                }        }        for(int i = max_v; i >= 0; i --) {                if( dp[i] ) {                        return i;                }        }}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE        freopen("test.in", "r", stdin);#endif        int max_v, n;        while( ~scanf("%d %d", &max_v, &n) ) {                for(int i = 0; i < n; i ++) {                        scanf("%d %d", &cnt[i], &val[i]);                }                printf("%d\n", knapsack(max_v, n));        }        return 0;}