#include int max(int a,int b) { if (a>b) return a; else return b; } int main() { //int max(int , int ); int n,m,i,j; int data[101][2]; int f[101][101]; scanf("%d%d",&n,&m); //n表示个数,m表示能背的最大重量 for(i=1;i=data[i][0]) { f[i][j]=max(f[i-1][j],f[i-1][j-data[i][0]] data[i][1]); //对于这件物品要么不选要么选,不选是f[i-1][j]; //选的话为f[i-1][j-data[i][0]]此处j-data[i][0]是因为要选上一次就得少背j-data[i][0]的重量 //才能装下这次的物品 } else f[i][j]=f[i-1][j]; } printf("%d
",f[n][m]); return 0; } 然后常见的背包问题还有多重背包问题,对于每一个物品可能有多个这种可以预处理成一般的背包问题,就是把几个摊开,很简单就不解释了,当然也可以加一维。
还有就是完全背包问题他的状态转移方程是f[i,j]=max(f[i-1][j],f[i][j-data[i]。v]); 他和01的区别只是要选的时候不是f[i-1][j-data[i]。v]而是f[i][j-data[i]。v],这样就能选到自己了,如果是初学可能不好理解,慢慢理会吧,其实这个很妙,我当初用了很多种方法,都是错的,看了一时也没明白,后来豁然开朗,然后对动规的理解都上了一个层次。
还有就是多为背包,这个只需要加一维,理解了前面的自然就能做出来了,根本不需要再看状态转移方程了(事实上理解后01就能够做出来了)。 一句话:要多思考,反复思考 我很久没碰算法了,我没现成的代码这是我手打出来的,求分。
全部