今日学习内容是DP中的完全背包问题。
集训队给的练习题是最小问题,所以就先从最小问题开始吧。
就是这道题,完全背包—最小问题—Piggy-Bank
开始打算看成特殊的01背包问题进行解决,但最终没有实现。是我太笨了。。
现在就是搬运代码时间了。
中途学了下无穷大常量的取值技巧:#define INF 0x3f3f3f3f
最终抄过来的代码:
/**
* TODO Auther: by SR
* Date: 2020-01-21 16:55:07
* LastEditTime: 2020-01-23 22:15:03
* ! 今日运势: 吉,无bug
* ?完全背包问题
* *这里是找最小值,不是找最大值。。
**/
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
int ans[10004],P[50004],W[10004];
int n,weight;
void min_bag();
int main(){
int T;
cin >> T;
while(T--){
cin >> n >> weight;
weight -= n;
cin >> n;
for(int j = 0; j <= weight; j++){//memset
ans[j] = INF;
}
ans[0] = 0;//!注意是ans[0]要初始化为0,不是ans[1]要初始化为0。
for(int i = 1; i <= n; i++){
cin >> P[i] >> W[i];
}
min_bag();
}
return 0;
}
void min_bag(){
for(int i = 1; i <= n; i++){
for(int j = W[i]; j <= weight; j++){
ans[j] = min(ans[j], ans[j - W[i]] + P[i]);//相比最大值问题主要是把max改成min,还有上面的初始化。
}
}
if(ans[weight] != INF){
cout<<"The minimum amount of money in the piggy-bank is "<<ans[weight]<<"."<<"\n";//没错后面有个句号。
}
else{
cout<<"This is impossible."<<"\n";
}
}
总之在饶了几个小弯后顺利给做出来了。
第二天早上起来又看了一下,才发现昨天并没有真正理解函数里的状态转移的情况。看来复习还是很有必要的!