用动态规划法解 0/1背包问题 要求用c语言编写程序原代码。

实验项目 0/1背包问题
1.实验题目
给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品总价值最大。
2.实验要求
(1)设计动态规划法的填表过程和求解方法;
(3)设计测试数据,并讨论所得结果。

1.动态规划#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define N 100 //货物的种类
#define M 10 //货物的质量(千克)typedef struct good
{
int no; //第几个物品
int w; //质量
int p; //可获利
int flag;
float pw; //获得的最高利润
}Good;void initGoodSet(Good a[],int n,int m);
int planning(Good a[], int m,int n); //动态规划void initGoodSet(Good a[], int n, int m)
{
int i;
srand(time(NULL));

for(i=0;i<n;i++)
{
a[i].no=i+1;
a[i].w=rand()%m+1;
a[i].p=rand()%n+1;
a[i].pw=(float)a[i].p/a[i].w;
}
}int planning(Good a[], int m,int n) //动态规划
{
int c[N+1][M+1];
int i,j;
for(i=0;i<=N;i++)
for(j=0;j<=M;j++)
c[i][j]=0;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
if(a[i-1].w<=j)
if(a[i-1].p+c[i-1][j-a[i-1].w]>c[i-1][j])
c[i][j]=a[i-1].p+c[i-1][j-a[i-1].w];
else
c[i][j]=c[i-1][j];
else
c[i][j]=c[i-1][j];
for(i=N,j=M;i>=1;i--)//倒推求最优解
if(c[i][j]>c[i-1][j])
{
a[i-1].flag=1;
j=j-a[i-1].w;
}
return (c[n][m]);
}void main()
{
double Start,End;
Good a[N];
Start=clock();
initGoodSet(a,N,M);
printf("共获利%d\n",planning(a,M,N));
End=clock();
printf("所需时间为:%lf\n",(End-Start)/1000);
}
温馨提示:内容为网友见解,仅供参考
无其他回答

0-1背包问题的多种解法代码(动态规划、贪心法、回溯法、分支限界法)
\/* 给定c>0, wi>0, vi>0, 0<=i<=n,要求找到一个n元的 \/* 0-1向量(x1, x2, ..., xn), 使得: \/* max sum_{i=1 to n} (vi*xi),且满足如下约束: \/* (1) sum_{i=1 to n} (wi*xi) <= c \/* (2) xi∈{0, 1}, 1<=i<=n \/* \/* 2. 0-1背包问题的求解 \/* 0-1...

动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤...
0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是 wi ,其价值为 vi ,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能 将物品i 装入背包多次,也不能只装入部分的物品...

动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤...
它们的价值分别为P1,P2,...,Pn.若每种物品只有一件求旅行者能获得最大总价值。输入格式:M,N W1,P1 W2,P2 ...输出格式:X \/ 因为背包最大容量M未知。所以,我们的程序要从1到M一个一个的试。比如,开始任选N件物品的一个。看对应M的背包,能不能放进去,如果能放进去,并且还有多的空间...

C语言 贪心算法求背包问题
int n,flag=1;float temp,M,w[N],p[N],x[N];int a[N],b[N];int k,j,l=0;printf(

0-1背包问题的动态规划算法
更新当前状态的解。在更新过程中,需要删除那些不符合条件的解。这样可以将解的数量从O(nW)减少到O(W),从而提高算法的效率。通过动态规划算法,我们可以解决0-1背包问题,并得到最优解。这种方法的时间复杂度为O(nW),空间复杂度为O(W),可以有效地解决实际问题。

简答题:用动态规划解下列0-1背包问题例题:(7分)n=3, w=[100,14,10...
, f[i-1,j]}程序procedure Make; begin for i:=0 to w do f[0,i]:=0; for i:=1 to m do for j:=0 to w do begin f[i,j]:=f[i-1,j]; if (j>=w) and (f[i-1,j-w]+v>f[i,j]) then f[i,j]:=f[i-1,j-w]+v; end; writeln(f[m,wt]); end;

背包问题的算法
readln(w[i],c[i]); fillchar(p,sizeof(p),-1); writeln(f(m)); end.3)贪婪算法改进的背包问题:给定一个超递增序列和一个背包的容量,然后在超递增序列中选(只能选一次)或不选每一个数值,使得选中的数值的和正好等于背包的容量。代码思路:从最大的元素开始遍历超递增序列中的每个元素,若背包还有大于...

【学界】0-1背包问题的动态规划算法
动态规划算法提供了一种高效求解0-1背包问题的方法。通过定义子问题(即在前i个物品中选择不超过W重量的物品,使得价值最大),并利用递推关系(选择第i个物品或不选择),可以构建一个二维表来存储所有可能的最优解。算法的复杂度是O(nW),其中n是物品数量,W是总重量限制。利用动态规划,可以有效...

动态规划的0-1背包问题,请高手解释下代码
简单解释一下吧 在解释之前你要知道动态规划是一个自底向上的过程 这个算法用到了一个二维数组m[][] 来存储各个坐标的价值信息 所以横坐标表示背包号码 纵坐标表示背包容量从1到c 注意该算法只能限制c是整数且每个背包的重量也是整数.然后int jMax=min(w[n]-1,c);找出w[n]-1和 c之间的小者。

0\/1背包问题能不能使用贪心法解决?
贪心算法解决背包问题有几种策略:(i)一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。例如,考虑n=2, w=[100,10,10], p =[20,15,15...

相似回答