FZUOJ 2214

来源:互联网 发布:防范网络诈骗标语 编辑:程序博客网 时间:2024/06/06 01:26

http://acm.fzu.edu.cn/problem.php?pid=2214

大容量背包逆向思维

#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <algorithm>#include <iostream>#include <cstring> using namespace std;const int maxn = 507;int dp[maxn + 1];int w[maxn], v[maxn];int main(){int T;scanf("%d", &T);while (T--) {int n, B, V = 0;scanf("%d%d", &n, &B);for (int i = 0; i < n; ++i) { //重量不超过B, sum (v) <= 5000scanf("%d%d", w + i, v + i);V += v[i];}memset(dp, 0x3f, sizeof dp);dp[0] = 0; //就错在dp这 for (int i = 0; i < n; ++i) {for (int j = V; j >= v[i]; --j) { //dp[j]表示装价值为j时所需的最小容量 if (dp[j - v[i]] + w[i] <= B) { //所需容量尽量小 dp[j] = min(dp[j], dp[j - v[i]] + w[i]);}}}int ans = -1;for (int j = V; j >= 0; --j) {printf("dp[%d] = %d\n", j, dp[j]);if (dp[j] <= B) {ans = j;break;}}printf("%d\n", ans); //价值, dp[j]为重量,dp[j]的价值为j}return 0;}


原创粉丝点击