DP入门, 0-1背包问题(HDOJ 2602类似)

来源:互联网 发布:macbook强制卸载软件 编辑:程序博客网 时间:2024/06/05 08:39

HLOJ 1006 0-1背包问题

HDU 2602 Bone Collector 类似,但要注意输入顺序和问题规模,最重要的是重量为0的骨头居然也有价值的!

#include<iostream>using namespace std;const int N=401;  //#define N 401 const int M=1501; //#define M 1501int f[N][M]; //下标从1开始用//n种物品,各种物品的容量、价值分别在w、v数组中;c为背包容量//状态:f[i][j],使用前i种物品构成背包容量为j时能获得的最大价值//转移方程:f[i][j]=max(f[i-1][j], f[i-1][j-w[i]]+v[i]),//转移方程中,前者表示不用第i种物品,后者表示用第i种物品//初值:0种物品时任何容量下能获得的最大价值都为0//结果:f[n][c]int max(int a, int b){if(a>b) return a;else return b;}int dpKnapSack(int n, int w[], int v[], int c) {int i,j;for (j=0; j<=c; j++) f[0][j]=0;for (i=1; i<=n; i++){//若有0容量但有价值的物品,则j从0开始,如 HDU 2602 Bone Collectorfor (j=1; j<=c; j++){if (j<w[i])//当前容量为j时,第i种物品放不下,肯定不用该物品f[i][j]=f[i-1][j];else  //在用与不用第i种物品中取大者f[i][j]=max(f[i-1][j], f[i-1][j-w[i]] + v[i]); }}return f[n][c];   }int main(){#ifndef ONLINE_JUDGE //一般的OJ(acm.zjut.edu.cn例外)都定义了这个符号常量//"e:\\input.txt"指文件名,"r"指打开方式为读,stdin表示标准输入freopen("e:\\input.txt","r",stdin);//需要先在E盘建立input.txt文件并放入测试数据//freopen("e:\\output.txt","w",stdout);//写打开,自动生成ouput.txt,放输出结果#endifint w[N], v[N];int n, c, i;while(scanf("%d%d",&n, &c)!=EOF){for(i=1;i<=n;i++) scanf("%d", &w[i]);for(i=1;i<=n;i++) scanf("%d", &v[i]);printf("%d\n", dpKnapSack(n, w, v, c));}return 0;}


原创粉丝点击