來自《挑戰程序設計競賽》
1.題目原文
2.解題思路1
3.代碼1
int n,W;
int w[maxn],v[maxn],m[maxn];
int dp[maxn][maxW];
void solve()
{
memset(dp,0,sizeof(dp));
for(int i=0;i<=W;i++){
dp[0][i]=0;
}
for(int i=0;i<n;i++){
for(int j=0;j<=W;j++){
for(int k=0;k<=m[i]&&j>=k*w[i];k++){
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
}
}
}
printf("%d\n",dp[n][W]);
}
這個算法時間複雜度較高,無法在規定時間內求解。4.解題思路2
5.代碼2
6.解題思路3
7.代碼3
int n,W;
int w[maxn],v[maxn],m[maxn];
int dp[maxW];
void solve()
{
for(int i=0;i<n;i++){
int num=m[i];
for(int k=1;num>0;k<<=1){
int mul=min(k,num);
for(int j=W;j>=w[i]*mul;j--){
dp[j]=max(dp[j],dp[j-w[i]*mul]+v[i]*mul);
}
num-=mul;
}
}
printf("%d\n",dp[W]);
}