一、問題
二、解題思路
三、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件物品不能放入當前容量...