SR的学习日志_DP问题_完全背包

今日学习内容是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";
    }
}

总之在饶了几个小弯后顺利给做出来了。

第二天早上起来又看了一下,才发现昨天并没有真正理解函数里的状态转移的情况。看来复习还是很有必要的!

发布了2 篇原创文章 · 获赞 0 · 访问量 252

猜你喜欢

转载自blog.csdn.net/limited_sky/article/details/104077809
今日推荐