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;
    }
    
  • 相关阅读:
    SDOI2016游戏
    李超线段树
    SDOI2016数字配对
    SDOI2016储能表
    ! JOISC2020DAY3星座3
    JOISC2020DAY2有趣的 Joitter 交友
    第十天学习内容 函数
    第九天学习内容 结构体
    第八天学习内容 集合
    第七天学习内容 数组
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308831.html
Copyright © 2011-2022 走看看