朴素算法:
可以把ni个物品逐个拆分,得到ni个物品。原问题转化为01背包问题
dp[ i ][ v ] = max( dp [ i-1 ][ v-k*ci ] + k*wi) , 0<=k<=ni
核心代码:
for(int i=1;i<=N;i++){
for(int j=0;j<=V;j++){
for(int k=0;k<=n[i];k++){
if(j>=c[i]*k){
dp[i][j]=max(dp[i-1][j-c[i]*k]+w[i]*k,dp[i][j]);
}
}
}
}
空间优化:(滚动数组 二维降一维)
for(int i=1;i<=N;i++){
for(int j=V;j>=0;j--){
for(int k=0;k<=n[i];k++){
if(j>=c[i]*k){
dp[j]=max(dp[j-c[i]*k]+w[i]*k,dp[j]);
}
}
}
}