日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

骨骼收集器01背包

發布時間:2023/12/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 骨骼收集器01背包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源hdu2602

問題描述

許多年前,在泰迪的家鄉,有一個人被稱為“骨頭收藏家”。這個男人喜歡收集各種各樣的骨頭,比如狗狗,牛,還有他去了墳墓......
骨頭收藏家有一個大容量的V袋,沿著他的收集之旅有很多骨頭,顯然,不同的骨骼具有不同的值和不同的體積,現在根據他的行程給出每個骨骼的值,你能計算出骨骼采集器可以得到的總值的最大值嗎?

輸入

第一行包含整數T,個案數。
接下來是T個案例,每個案例有三行,第一行包含兩個整數N,V,(N <= 1000,V <= 1000)表示骨骼的數量和他的包的體積。第二行包含表示每個骨骼值的N個整數。第三行包含表示每個骨骼體積的N個整數。

輸出

每行一個整數表示總值的最大值(此數字將小于2 31)。

樣本輸入

1
5 10
1 2 3 4 5
5 4 3 2 1

樣本輸出

14

最基礎01背包,判斷第i件要不要放進去,狀態轉移方程dp[i][V]=max{dp[i-1][V],dp[i-1][V-v[i]]+w[i]}

“將前i件物品放入容量為v的背包中”這個子問題,若只考慮第i件物品的策略(放或不放),那么就可以轉化為一個只牽扯前i-1件物品的問題。如果不放第i件物品,那么問題就轉化為“前i-1件物品放入容量為v的背包中”;如果放第i件物品,那么問題就轉化為“前i-1件物品放入剩下的容量為v-c[i]的背包中”,此時能獲得的最大價值就是f [i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。

#include<iostream> #include<stdio.h> #include<stdlib.h> #include <iomanip> #include<cmath> #include<float.h> #include<string.h> #include<algorithm> #define sf scanf #define pf printf #define scf(x) scanf("%d",&x) #define scff(x,y) scanf("%d%d",&x,&y) #define prf(x) printf("%d\n",x) #define mm(x,b) memset((x),(b),sizeof(x)) #include<vector> #include<queue> #include<map> #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=a;i>=n;i--) typedef long long ll; const ll mod=1e9+100; const double eps=1e-8; using namespace std; const double pi=acos(-1.0); const int N=1005; int dp[N][N]; int w[N],v[N]; int main() {int re,V,n;scf(re);v[0]=0;w[0]=0;while(re--){mm(dp,INT_MIN);scff(n,V);rep(i,1,n+1)scf(w[i]);rep(i,1,n+1)scf(v[i]);rep(i,1,n+1)//第i件物品 rep(j,0,V)//空間為j的時候 {if(v[i]<=j)dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);elsedp[i][j]=dp[i-1][j];}prf(dp[n][V]);}return 0; }

一維

#include<iostream> #include<stdio.h> #include<stdlib.h> #include <iomanip> #include<cmath> #include<float.h> #include<string.h> #include<algorithm> #define sf scanf #define pf printf #define scf(x) scanf("%d",&x) #define scff(x,y) scanf("%d%d",&x,&y) #define prf(x) printf("%d\n",x) #define mm(x,b) memset((x),(b),sizeof(x)) #include<vector> #include<queue> #include<map> #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=a;i>=n;i--) typedef long long ll; const ll mod=1e9+100; const double eps=1e-8; using namespace std; const double pi=acos(-1.0); const int N=1e3+5; int dp[N]; int w[N],v[N]; int main() {int re,V,n;scf(re);while(re--){mm(dp,0);scff(n,V);rep(i,1,n+1)scf(w[i]);rep(i,1,n+1)scf(v[i]);rep(i,1,n+1){per(j,V,v[i])dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}prf(dp[V]);}return 0; }

轉載于:https://www.cnblogs.com/wzl19981116/p/9487625.html

總結

以上是生活随笔為你收集整理的骨骼收集器01背包的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。