zoukankan      html  css  js  c++  java
  • HDU 2602 Bone Collector(0/1背包)

    思路:

    1.设dp[i][j]为前i个物品中,可以装进体积为j的背包里,所有物品的最大值;
    2.设val[i]为第i个物品的价值,vol[i]为第i个物品的体积,则我们可以得到
    dp[i][j]={dp[i1][j]j<vol[i]max(dp[i1][j],dp[i1][jvol[i]]+val[i])j>=vol[i]dp[i][j]= egin{cases} dp[i-1][j]& ext{j<vol[i]}\ max(dp[i-1][j],dp[i-1][j-vol[i]]+val[i])& ext{j>=vol[i]} end{cases}

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int MAX_N=1001;
    const int MAX_V=1001;
    int dp[MAX_N][MAX_V];    //前i个骨头装进体积为j的背包,价值的最大值 
    int val[MAX_N];
    int vol[MAX_N];
    void clear(int& n,int& v){
    	for(int i=1;i<=n;i++) val[i]=vol[i]=0;
    	for(int i=0;i<=n;i++){
    		for(int j=0;j<=v;j++) dp[i][j]=0;
    	}
    }
    int main(){
    	int t;
    	scanf("%d",&t);
    	while(t--){
    		int n,v;
    		scanf("%d%d",&n,&v);
    		for(int i=1;i<=n;i++) scanf("%d",val+i);
    		for(int i=1;i<=n;i++) scanf("%d",vol+i);
    		for(int j=vol[1];j<=v;j++) dp[1][j]=val[1];
    		for(int i=2;i<=n;i++){
    			for(int j=0;j<=v;j++){
    				if(vol[i]>j) dp[i][j]=dp[i-1][j];
    				else dp[i][j]=max(dp[i-1][j],dp[i-1][j-vol[i]]+val[i]);
    			}
    		}
    		printf("%d
    ",dp[n][v]);
    		clear(n,v);
    	}
    	return 0;
    }
    
  • 相关阅读:
    科普园地
    专家段 错误 新闻
    16进制转rgb
    图片截取0825
    域名的问题 图片显示不出来
    height cell0809
    添加银行卡
    DeviceDelegateHelper.m
    UUID
    MBProgressHUD 动画
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308831.html
Copyright © 2011-2022 走看看