1)
背包基础,先以01背包、求背包所装物品价值之和的最大值、不要求恰好装满时,易于理解的二维DP数组存储为例:
#include <iostream>
#include <string.h>
using namespace std;
int dp[1010][1010];
int vp[1010];
int wp[1010];
int main()
{
int kase;cin>>kase;
while(kase--){
memset(dp,0,sizeof(dp));
int n,v;cin>>n>>v;
int v1,w1;
for(int i=1;i<=n;i++){
cin>>vp[i];
}
for(int i=1;i<=n;i++){
cin>>wp[i];
}
for(int i=1;i<=n;i++){
v1=vp[i];w1=wp[i];
for(int j=0;j<=v;j++){//正序、逆序,皆可,因为有第一唯i的存在,保证了每一次更新都保证不会放入相同的物品
if(j>=w1)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w1]+v1);
else
dp[i][j]=dp[i-1][j];//假如第i个因为体积原因放不进去,那么d第i个的状态继承第i-1的状态(如果不操作,则为初始值0)
}
}
cout<<dp[n][v]<<endl;
}
}