完全背包问题,背包解法详见背包九讲
题意:
有一个罐子,里面装着钱,你知道它里面装的钱的重量。
同时给出所有种类的钱的价值和重量,问罐子装满时的最小重量
初始化时,由于只有在体积为0的时候被装满,所以只有d[0]=0,而其他情况都未知,所以设为最大值
样例解释
3 10 110 2 1 1 30 50 10 110 2 1 1 50 30 1 6 2 10 3 20 43的意思是会有3个样例
而每个样例的第一行的两数相减即为罐子的装的钱的重量
再给出一个数n,意思是多少种类的钱
接下来n行,每行表示该种钱的价值和重量
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
class node
{
public:
int val;
int weight;
};
vector<node>coins;
#define MAX 1000000000//假定的最大值
int d[20000];
int main()
{
int sumWeight;
int total;
cin>>total;
while(total--)
{
coins.clear();
int a,b;
cin>>a>>b;
sumWeight=b-a;//罐子装的钱的重量
int n;
cin>>n;
for(int i=0;i<n;i++)
{
node temp;
cin>>temp.val>>temp.weight;
coins.push_back(temp);
}
d[0]=0;//只有这个是已知的
for(int i=1;i<=sumWeight;i++)
{
d[i]=MAX;//未知情况设为无穷大
}
for(int i=0;i<n;i++)
{
for(int j=0;j<=sumWeight;j++)
{
if(j-coins[i].weight<0)
{
continue;
}
if(d[j]>d[j-coins[i].weight]+coins[i].val)//完全背包的状态转移
{
d[j]=d[j-coins[i].weight]+coins[i].val;
}
}
}
if(d[sumWeight]==MAX)
{
cout<<"This is impossible."<<endl;
}
else
{
cout<<"The minimum amount of money in the piggy-bank is "<<d[sumWeight]<<'.'<<endl;
}
}
return 0;
}