背包问题动态规划_背包问题动态规划伪代码
背包问题
WX[i-1]=W[h];装箱问题 P1133
背包问题动态规划_背包问题动态规划伪代码
背包问题动态规划_背包问题动态规划伪代码
i,j,v,n,x:longint;
f:array[0..20001] of boolean;
begin
readln(v,n);
for i:=1 to n do f[i]:=false;
f[0]:=true;
for i:=1 to n do begin
readln (x);
for j:=v-x downto 0 do
if f[j] Then f[j+x]:=true;
end;
i:=v;
while (i>0)
and not f[i]
do i:=i-1;
wrin(v-i);
end.
采 P1104
i,j,n,t,x,m:longint;
s:array[0..20001] of longint;
begin
readln(t,n);
for i:=1 to n do
begin
readln (x,m);
if x<=t then
for j:=t downto x do
if s[j-x]+m>s[j] Then s[j]:=s[j-x]+m;
end;
write(s[t])
end.
f:array[0..1002] of longint;
begin
readln (n);
readln (t);
for i:=1 to n do begin
readln (fi,ti);
if ti<=t then begin
for j:=t downto ti do
end;
end;
wrin (f[t]);
end.
开心的金明 P1317
i,j,n,t,x,m:longint;
s:array[0..30000] of longint;
begin
readln(t,n);
for i:=1 to n do
begin
readln (x,m);
if x<=t then
for j:=t downto x do
if s[j-x]+mx>s[j] Then s[j]:=s[j-x
]+mx;
end;
wrin (s[t]);
end.
NASA的食物 P1334
var m,v,n,i,mi,vi:integer;
mm,vv,kk:array[1..50] of integer;
f:array[0..400,0..400] of integer;
begin
readln(v,m);
readln(n);
for i:=1 to n do readln(vv[i],mm[i],kk[i]);
fillchar(f,sizeof(f),0);
for i:=1 to n do
for vi:=v downto vv[i] do
fotype ar=array[1..maxn] of integer;r mi:=m downto mm[i] do
if f[vi,mi] f[vi,mi]:=f[vi-vv[i],mi-mm[i]]+kk[i]; wrin(f[v,m]); end. 不是很懂,不过找到了一个与你这个问题有关的算法,希望有帮助 DKNAP(p2,w2,M2,n2) float p2[],w2[]; float M2; int n2; int F[10],x[10]; float P[1000],W[1000],pp,ww,PX[10],WX[10],PY[10],c; F[0]=1; P[1]=W[1]=0; l=h=1; F[1]=next=2; for (i=1; i<=n2; i++) {k=l; r=l; {if (W[r]+w2[i]<=M2) r++; else break; }u=r-1; for (j=1; j<=u; j++) {pp=P[j]+p2[i]; ww=W[j]+w2[i]; while (k<=h && W[k] {P[next]=P[k]; W[next]=W[k]; next++; k++; }if (k<=h && W[k]==ww) {pp=max(pp,P[k]); k++; }if (pp>P[next-1]) {P[next]=pp; W[next]=ww; next++; }while (k<=h && P[k]<=P[next-1]) k++; }while (k<=h) {P[next]=P[k]; W[next]=W[k]; next++; k++; }//对Si+1置初值 PX[i-1]=P[h]; l=h+1; h=next-1; }c=M2; for (i=n2-1; i>=0;i--) {j=F[i]; while (j<=F[i+1]-1) {if (W[j]+w2[i+1]<=c) j++; else break; }u=j-1; if (u else PY[i]=P[u]+p2[i+1]; if (PX[i]>PY[i]) x[i+1]=0; else {x[i+1]=1; c=c-w2[i+1];} //printf("%d",x[i+1]); //printf("n"); }printf("0-1背包问题动态规划方法的解x(n)如下:n"); for (i=1;i<=n2;i++) printf("%4d",x[i]); printf("n"); }///////////////////////////////////////////// BKNAP(p3,w3,M3,n3) float p3[],w3[],M3; int n3; {int k,i,j,y[10],x[10],b[10]; float cw,cp,fp,fw,a[10],s,t; for (i=1;i<=n3;i++) {a[i]=p3[i]/w3[i]; b[i]=i; }for (j=1;j<=n3-1;j++) {for (i=1;i<=n3-j;i++) {s=a[i];a[i]=a[i+1];a[i+1]=s; t=b[i];b[i]=b[i+1];b[i+1]=t; }; }for (i=1;i<=n3;i++) printf("%4dn",b[i]); printf("n"); cw=cp=0; k=1; fp=-1; for (k=1;;k++) {while (k<=n3 && cw+w3[k]<=M3) {cw+=w3[k]; cp+=p3[k]; y[k]=1; k++; }if (k>n3) {fp=cp; fw=cw; k=n3; for (i=1;i<=k;i++) x[b[i]]=y[i]; break; }else y[k]=0; while (bound(cp,cw,k,M3,n3,w3,p3)<=fp) {while (k!=0 && y[k]!=1) k-=1; if (k==0) return; y[k]=0; cw-=w3[k]; cp-=p3[k]; }} printf("0-1背包问题回溯方法的解x(n)如下:n"); for (i=1; i<=n3; i++) {//j=b[i]; printf("%4d",x[i]); }printf("n"); printf("%4f,%4f",fp,fw); printf("n"); }float bound(zp,zw,k,M4,n4,ww,pp) float zp,zw,M4,ww[],pp[]; int k,n4; {int i; float b,c; b=zp;c=zw; for (i=k+1;i<=n4;i++) {c+=ww[i]; if (c<=M4) b+=pp[i]; }return (b); } 就两个算法,一个++,一个比较。建议做子函数 收藏了 背包问题是组合优化学科中一个经典而的问题,它的研究价值不言而喻,吸引了众多专家学者从各个角度开展对其的研究工作,各种算法设计思想也应运而生。由于背包问题的NP完全性,如何在算法的时间效率和求解精度上取得有效的平衡,成为背包问题算法设计主要的考虑因素。数据挖掘是近几年信息领域发展最快的技术之一。由于数据挖掘具有强大的发现有用知识的功能,可以利用它来发现背包问题解的相似的状态空间,然后进行约减,从而克服背包问题的NP困难性。 背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的价值。 Pi表示第iF[i+1]=next;件物品的价值。 决策:为了背包中物品总价值化,第 i件物品应该放入背包中吗 ? 背包问题动态规划解决的时间复杂度应该是O(2^n)吧。把整个问题构造一个满二叉树,每一层的表示第i个物品,比如从顶点出发,顶点表示个物品,若选择左支,表示选中个物品,右支表示没有选中个物品,以此类推,这样从顶点到叶子的一条路径就是最终的一个整体选择过程,在过程中可以判定选中现有物品是否满足给定条件。实际是暴利算法,把所有可能情况穷举了一遍。由于树是N层的满二叉树,所以时间复杂度是O(2^n)。这已经成指数次增长了,不能算多项式时间复杂度。 贪心算法是在局部保持,一直保持,直到全局。 ------------C++有关0--1 背包问题
小飞侠的游园方案 P1025背包问题的发展历程及研究现状
鉴于数目不大,可以用穷举法请问背包问题的时间复杂度不是一个多项式时间复杂度如何解释?
题:贪心算法 双背包问题 就是有两个背包的贪心算法 谁知道啊 急求
memset(b,0,sizeof(b));
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。