完全背包与01背包不同之处在于,每件物品的数量都是无限的。
在处理的时候:01背包是后面的前面dp, 完全背包是从前面到后面dp
一下是代码,本来可以1A的,没注意到输出数字后面还要输出一个点
#include <iostream>
using namespace std;
const int M = 100000000;
const int W = 10001;
int dp[W];
int w[501], v[501];
int main()
{
int t;
cin >> t;
while(t--)
{
int E, F;
cin >> E >> F;
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> v[i] >> w[i]; //其实可以不需要用这个数组,每次输入的时候直接进行dp
int maxw = F - E;
for(int i = 0; i <= maxw; i++)
dp[i] = M;
dp[0] = 0;
for(int i = 0; i < n; i ++)
{
for(int j = w[i]; j <= maxw; j++)
dp[j] = min(dp[j], dp[j-w[i]] + v[i]);
}
if(dp[maxw] == M)
cout << "This is impossible."<< endl;
else
cout << "The minimum amount of money in the piggy-bank is " << dp[maxw]<< "." << endl;
}
return 0;
}