骨骼收集器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
總結
- 上一篇: 平安信用卡消费专用备用金被拒是怎么回事?
- 下一篇: 【PAT】B1070 结绳(25 分)