HDOJ 2602 Bone Collector
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int w[1002];
int va[1002];
int dp[1002][1002];
int main()
{
int t;
cin>>t;
while(t--){
int n,v;
cin>>n>>v;
memset(w,0,sizeof(w));
memset(va,0,sizeof(va));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v;j++)//从0开始 后加判断
if(j>=w[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+va[i]);
else dp[i][j]=dp[i-1][j];
}
cout<<dp[n][v]<<endl;
}
return 0;
}
使用一维数组优化时,由于代码特性,可以自动保存dp[i-1][j]而不是初始化为0,因此第二层循环可以只到w[i]