1.确定状态
dp[n][v]:用前n个物品任意选取是否组成v的容量
dp[i][j]有两种状态:为1或为0
2.状态转移
dp[i][j]为1时,dp[i-1][j]=1||dp[i-1][j-v[i]]=1其他的状态均为0. 如果不放第i件物品,为dp[i-1][j];如果放第i件物品,为dp[i-1][j-v[i]]
有用的为最后一行,其余均是子问题
优化空间复杂度:
可以只关注两行的内容,
for(i,从0到n)
{
for(j,从0到v)
{
if(dp[i-1][j]==1||dp[i-1][j-v[i]==1)
dp[i][j]=1;
}
for(j,从0到v)
{
dp[0][j]=dp[i][j];//只保留第一行
}
}