//完全背包
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N = 500+5;
const int M = 10000+5;
const int inf = 0x3f3f3f3f;
struct Node {
int v, w;
} A[N];
int dp[M];
int main() {
int T, s, e, n;
cin >> T;
while(T--) {
cin >> s >> e;
int MAX = e-s;
cin >> n;
for(int i=0; i<n; i++) {
cin >> A[i].v >> A[i].w;
}
memset(dp, inf, sizeof(dp));
dp[0] = 0;
for(int i=0; i<n; i++) {
for(int j=A[i].w; j<=MAX; j++) {
dp[j] = min(dp[j], dp[j-A[i].w]+A[i].v);
}
}
if(dp[MAX] == inf)
printf("This is impossible.\n");
else printf("The minimum amount of money in the piggy-bank is %d.\n", dp[MAX]);
}
return 0;
}

本文深入解析了完全背包问题的算法实现,通过一个具体的例子展示了如何使用动态规划解决背包问题,包括初始化状态数组、更新状态以及处理边界条件。适用于对算法和数据结构有一定了解的读者。
445

被折叠的 条评论
为什么被折叠?



