01揹包問題變形

2021-08-22 05:01:14 字數 1715 閱讀 1511

一、問題

二、解題思路

三、c++**

下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?。。一直沒法ac,,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。

#include#define max 50

using namespace std;

int n,m;

double cw,cp,bestp,perp[max],w[max],v[max];

void swap(int i,int j)

void quicksort(int p,int q)

while(1)

quicksort(p,j-1);

quicksort(j+1,q);

}double bound(int i)

if(i<=n)

b+=perp[i]*leftw;

return b;

}void backtrack(int i)

return ;

} if(cw+w[i]<=m)

if(bound(i+1)>bestp)

backtrack(i+1);

}void pack()

quicksort(1,n);

backtrack(1);

}int main()

pack();

ans[a++]=bestp;

t--;

} for(i=0; i看了一位大神的答案。。。

原文:原來要用折半列舉+二分查詢:

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const long long inf=99999999999999999ll;

const int exp=1e-5;

const int ms=42;

mapmp;

int n;

ll w;

ll w[ms],v[ms];

void solve()

}mp[sw]=max(mp[sw],sv);

}ll ans=-inf;

for(int i=0;i< 1<

}if(mp.count(w-sw))

ans=max(ans,mp[w-sw]+sv);

}printf("%lld\n",ans); }

int main()

{ int t;

scanf("%d",&t);

while(t--)

{scanf("%d%lld",&n,&w);

for(int i=0;i我決定還是回去好好修煉。。

01揹包變形

傳送門 現有n個物品,序號分別為1,2,n。對於每個i 1 i n 物品i有乙個體積wi和乙個價值vi。小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w。求出小明可以帶回家的物品總價值可能的最大值。constraints input 標準輸入格式如...

01揹包 問題變形 飯卡

example hdu 2546 解 利用 01揹包 狀態方程 f v max f v f v ci wi 1 對這個問題來說,干擾項是最後的5元,可以買任何一道菜,所以可以先用5元買最貴的一道菜 反正買最後一道菜時至少要有5元餘額,不如先不考慮這5元 去掉干擾項後就是乙個 01 問題了。2 一道菜...

01揹包問題 優化及變形

問題描述 有n件商品,第i件商品的重量是weights i 1 價值是values i 1 揹包容量是cap 則揹包能夠裝物品的最大價值首先構建乙個二維陣列dp,dp i j 表示第i件物品時揹包容量為j時的最大價值。如何求得dp i j 1 values i 1 j,說明第i件物品不能放入當前容量...