(精)hdoj 2602(01背包问题)(动态规划)
2012-04-23 19:42
351 查看
/* 1 输入部分应该是放在1到n,最后为=号因为。我们初始的时候认为0是没有取任何物品的。如果说以0为开始,那么第一件装备没有选 2 输入的时候应该看清楚什么是value什么是valume。 */ #include<iostream> #include<stdio.h> using namespace std; #define MAX 1005 //#define MAX 15 int f[MAX][MAX];//f[i][j]表示前i件物品当中选出若干件,放在剩余未j的背包中所得到的最大收益 //状态转化方程为f[i][j]=max{f[i-1][j-Wi]+Pi,f[i-1][j]}.有一个条件是j>=Wi。这样的时候才能保证不会是0 int w[MAX]; int v[MAX]; int main() { //freopen("in.txt","r",stdin); int casen;scanf("%d",&casen); int i,j,k; int M;//一共有M件物品 int W;//总的空间是W while(casen--) { //输入部分 scanf("%d %d",&M,&W); for(i=1;i<=M;i++) { scanf("%d",&v[i]); } for(i=1;i<=M;i++) { scanf("%d",&w[i]); } //初始化 for(i=0;i<MAX;i++) { for(j=0;j<MAX;j++) { f[i][j]=0; } } //开始处理 for(i=0;i<=W;i++) { f[0][i]=0; } //i表示第i件物品。我们主要是看第i件物品是不是放入 for(i=1;i<=M;i++) { for(j=0;j<=W;j++) { f[i][j]=f[i-1][j]; //如果剩余的背包能够放下第i件物品,而且放入以后比不放入的价值变大了。 if( j>=w[i] && f[i-1][j-w[i]]+v[i]>f[i][j] ) { f[i][j]=f[i-1][j-w[i]]+v[i]; } } } cout<<f[M][W]<<endl; } return 0; }
相关文章推荐
- hdoj 2602 (01背包问题)
- HDOJ-2602 Bone Collector [DP-01背包问题]
- Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)
- HDOJ 题目2602 Bone Collector(动态规划,01背包)
- HDU - 2602(动态规划,01背包问题)
- HDOJ 2602 Bone Collector 【动态规划 01背包】
- 动态规划之01背包问题
- [动态规划]背包问题九讲(1)----01背包问题
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
- 动态规划的详细解析(01背包问题)
- hdu 2602(01背包问题)
- 01背包问题 动态规划
- HDOJ---1203 I NEED A OFFER![01背包问题]
- hdu 1574 RP问题 动态规划,01背包的变形
- 动态规划解决01背包问题
- 动态规划——01背包问题
- 动态规划之01背包问题
- 理解动态规划——01背包问题
- 动态规划之01背包问题和三角形问题