核心代码:fori=1..Nforv=0..Vfork=1..vdivw[i]f[i][v]=max{f[i-1][v],f[i-1][v-k*w[i]]+k*c[i]};将01背包问题的基本思路加以改进,得到了这样一个清晰的方法。这说明01背包问题的方程的确是很重要,可以推及其它类型的背包问题。3空间优化 01背包中,我们使用一维数组来优化空间,完全...
scanf("%d%d",&w[i],&c[i]);for(inti=1;i<=n;i++) {for(intv=m;v>0;v--) {if(w[i]<=v)//必须要判断f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]);elsef[i][v]=f[i-1][v]; } } printf("%d",f[n][m]);return0; } 完全背包 【代码】 二维 #include<io...
一、代码 #include <iostream>usingnamespacestd;intdp[205];intw[50],c[50];intmain(){intm,n;cin>>m>>n;for(inti =1;i<=n;i++){cin>>w[i]>>c[i];}for(inti =1;i<=n;i++){for(intj =1;j<=m;j++){if(j >=w[i])dp[j]= max(dp[j],dp[j - w[i]] +c[i]); //...
B部分的最大值为: f[i - 1][j - 1 * vi ] + 1 * wi 。 C 部分:第二件物品选 2 件。C 部分的最大值为:f[i - 1][j - 2 * vi ] + 2 * wi。 g[2][4] 中的最大值为 max(A,B,C)。 通过上面分析,我们可以知道,g[i][j] 可以分成若干部分: A 部分是第 i 种物品选 0 个...
首先,在多重背包问题中,对于一个物品a,假设它有s个,还记得上面的划分规则吗,我们以二进制的形式对其进行划分,将这s个物品分成 1, 2, 4,8...2^{n},C 这(n + 2)个堆,同时这些堆的数量满足以下性质: 前n + 1堆第m堆的物品a的数量是 2^{m - 1} 个,也就是以二进制的形式划分这s个物品a...
#include<cmath> #include<string> #include<set> #include<list> #include<vector> #include #include<iterator> #include<algorithm> #include<iostream> #define maxm 1000 #define maxn 32 using namespace std; int W[maxn], V[maxn]; //打印...
c=i; if(c%a==0){//排序好了,用倍数计算就不用判断那么多了 list[l][i]=maxs(list[l-1][i],list[l][i-1],c/a*b); continue; } intjudge=-1; while(c){ if(c-a<0)break; if(list[l][i]!=0){ if(judge==0)//除c外的其它空间已经被用了,如果要继续加,就要减去前面的,让这...
AC代码: #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define MAX 507 using namespace std; int n,m,b,mod; int a[MAX]; int dp[MAX][MAX]; int main ( ) { while (~scanf ("%d%d%d" , &n , &m , &b , &mod )) { ...
完全背包的理论基础: 因为一个物品可以取多次,因此遍历顺序和0-1背包不同。 0-1背包遍历背包的时候是倒序,这里是顺序,允许重复,且物品和背包可以交换遍历顺序。 完全背包先...
readln(w[i],c[i]);writeln(f(m));end.说明:当m不大时,编程很简单,但当m较大时,容易超时.4.2 改进的递归法 改进的的递归法的思想还是以空间换时间,这只要将递归函数计算过程中的各个子函数的值保存起来,开辟一个 一维数组即可 程序如下:program knapsack04;const maxm=2000;maxn=30;type ...