入门经典 DP 0-1背包问题

来源:互联网 发布:金融领域国产密码算法 编辑:程序博客网 时间:2024/06/04 09:00
/*0-1背包问题*/#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;const int INF = 1<<30;const int MAXN = 100;int v[MAXN];int w[MAXN];int d[MAXN][MAXN];int s[MAXN][MAXN];int n, c;void dp(){    memset(d, 0, sizeof(d));    memset(s, 0, sizeof(s));    for(int i=n; i>0; i--) {        for(int j=0; j<=c; j++) {            d[i][j] = d[i+1][j];            if(j >= v[i] && d[i][j] < d[i+1][j-v[i]]+w[i]) {                d[i][j] = d[i+1][j-v[i]] + w[i];                s[i][j] = 1;            }        }    }}void dp2(){    memset(d, 0, sizeof(d));    memset(s, 0, sizeof(s));    for(int i=1; i<=n; i++) {        for(int j=0; j<=c; j++) {            d[i][j] = d[i-1][j];            if(j >= v[i] && d[i][j] < d[i-1][j-v[i]]+w[i]) {                d[i][j] = d[i-1][j-v[i]] + w[i];                s[i][j] = 1;            }        }    }}void print(int i, int j) {    if(i>n) return;    if(s[i][j]) {        printf("%d\n", i);        print(i+1, j-v[i]);    } else {        print(i+1, j);    }}void print2(int i, int j){    if(i<1) return;    if(s[i][j]) {        print2(i-1, j-v[i]);        printf("%d\n", i);    } else {        print2(i-1, j);    }}int main(){    #ifndef ONLINE_JUDGE    freopen("in.txt", "r", stdin);    #endif    /*    while(scanf("%d%d", &n, &c) == 2) {        for(int i=1; i<=n; i++) {            scanf("%d%d", &v[i], &w[i]);        }        dp();        printf("MAX weight: %d\n", d[1][c]);        print(1, c);        dp2();        printf("MAX weight: %d\n", d[n][c]);        print2(n, c);    }    */    int f[MAXN];    while(scanf("%d%d", &n, &c) == 2) {        memset(f, 0, sizeof(f));        int V, W;        for(int i=1; i<=n; i++) {            scanf("%d%d", &V, &W);            for(int j=c; j>=0; j--) {                if(j >= V && f[j]<f[j-V]+W) {                    f[j] = f[j-V] + W;                }            }        }        printf("MAX weight: %d\n", f[c]);    }    return 0;}

原创粉丝点击