入门经典 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;}