标签:include mes 开始 ace 就会 while 问题 sign 01背包
01背包:有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到 的价值是Wi。求解将哪些物品装入背包可使价值总和最大。(每件物品只有一件,放或者不放)
即F[i,v]表示前i件物品恰放入一个容量为v的背包可以 获得的最大价值。则其状态转移方程便是:
F[i,v] = max{F[i−1,v],F[i−1,v−Ci] + Wi}
我们可以做一点空间上的优化,用F[v]表示当前v空间所获得的最大价值,则F[v]=max(F[v],F[v-Ci]+W[i]);
这里要注意一个问题,空间优化时第二层循环一定要从V开始,因为如果从Ci开始的话,F[v]就可能由F[i,,v-Ci]推出,答案可能就会错
1 #include<iostream> 2 #include<string.h> 3 #include<string> 4 #include<sstream> 5 #include<vector> 6 #include<deque> 7 #include<map> 8 #include<algorithm> 9 #include<iomanip> 10 #include<math.h> 11 #include<set> 12 using namespace std; 13 14 int maxn = 0x3f3f3f3f3f; 15 typedef long long ll; 16 typedef unsigned long long ull; 17 18 int dp[1005]; 19 int val[1005], v[1005]; 20 int main() 21 { 22 int t; 23 cin >> t; 24 int n,V; 25 while (t--) 26 { 27 cin >> n>>V; 28 for (int i = 1; i <= n; i++) 29 scanf_s("%d", &val[i]); 30 for (int i = 1; i <= n; i++) 31 scanf_s("%d", &v[i]); 32 memset(dp, 0, sizeof(dp)); 33 for (int i = 1; i <= n; i++) 34 { 35 for (int j = V; j >=v[i]; j--) 36 { 37 dp[j] = max(dp[j], dp[j - v[i]] + val[i]); 38 } 39 } 40 cout << dp[V] << endl; 41 } 42 return 0; 43 }
标签:include mes 开始 ace 就会 while 问题 sign 01背包
原文地址:https://www.cnblogs.com/QingFengDaHui/p/10472875.html