给定背包体积v(总重减去v),物品数n(100),每个物品的重量(1000)
求是否能恰好装满背包
如果不能,输出0
如果有多解,输出-1
否则输出解的方案
一道满包输出方案题
需要注意的地方有很多
1.统计方案数时初始dp[0][0]一定要设为-1
2.每次转移时j从0开始转移,目的是把j为0的状态转移过来(此条针对二维数组)
3.尤其是!不要秀!踏踏实实写代码!多写一行有什么大不了的!是要可读性!是要效率!而不是秀!
int v=-read(),n=read();
for(int i=n;i>=1;i--)
v+=(save[i]=read());
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=v;j++)
{
dp[i][j]+=dp[i-1][j];
if(j>=save[i])
dp[i][j]+=dp[i-1][j-save[i]];
}
if(dp[n][v]==0) printf("%d\n",0 );
else if(dp[n][v]>1) printf("%d\n",-1 );
else
for(int i=n,j=v;i>=1;i--)
{
if(dp[i-1][j-save[i]])
{
printf("%d ",n+1-i );
j-=save[i];
}
}
把vijos难度7以上的背包题都做一下.