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;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308831.html