题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
这是一道简单的01背包问题的应用,直接用01代码一次性AC
源代码:
//HDOJ 2602 AC
#include <iostream>
using namespace std;
#define LEN 1001 //刚开始看错了 写成了 10001结果说是超出内存
int value[LEN],volume[LEN];
int dp[LEN][LEN];
//比较两个数的大小
int max(int a,int b){
if(a>b){
return a;
}
else{
return b;
}
}
//可用作模板
void cal(int n,int v,int tt[],int pp[]){
int i,j;
for(i=1;i<=n;i++){
for(j=0;j<=v;j++){
if(j>=tt[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-tt[i]]+pp[i]);
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
}
int main(){
int nCase,i;
int n,v;
cin>>nCase;
while(nCase--){
memset(dp,0,sizeof(dp));//初始化
cin>>n>>v;
for(i=1;i<=n;i++){
cin>>value[i];
}
for(i=1;i<=n;i++){
cin>>volume[i];
}
cal(n,v,volume,value);
cout<<dp[n][v]<<endl;
}
return 0;
}