训练日记2019.10.28 动态规划

2019.10.28 星期一
好吧,苦逼的一周又要开始了,今天脑子已经转不动了。今天自己写了套高精度计算模板,然后做了几个dp,dp是万物之源!!acm很多题就算你数据结构会,不会dp照样白给,这个思想还是很重要的,毕竟不是用数组存个表就叫dp了。不过也侧面印证了一件事情,大学生现在真的是缺乏锻炼了。

背包其实也没多难,就是两种状态,装和不装,noip对于时间复杂读几乎是很宽容的,也不需要特别去注意什么卡常数之类的问题。动态规划的本质就是用数组的下标来表示一些信息,比如剩余的重量,或者是剩余的钱数之类的,然后数组存内容,通过满足无后效性从之前已经有的信息中得到自己所需要的信息,另外可以提前终止无效的大海捞针似的查找。今天写到这里已经挺累的了,不想再去干别的了。自己还是去多写一些东西吧。

#include <bits/stdc++.h>
using namespace std;
#define limit 30000 + 5//防止溢出
#define INF 0x3f3f3f3f
#define inf 1<<20
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define ff(a) printf("%d\n",a );
#define MOD 1e9 + 7
typedef long long ll;
void read(int &x){
    char ch = getchar();x = 0;
    for (; ch < '0' || ch > '9'; ch = getchar());
    for (; ch >='0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}//快读
int n, m;
int dp[limit];
int a[limit];
int main(){
    //freopen("C:\\Users\\administrator01\\CLionProjects\\untitled14\\data.txt", "rt" , stdin);
    scanf("%d%d" , &n, &m);
    for(int i = 1 ; i <= m ; ++i){
        scanf("%d" , &a[i]);
    }
    memset(dp, 0 , sizeof(dp));
    for(int i = 1 ; i <= m ; ++i){
        for(int j = n ; j - a[i] >= 0; --j){
            dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
        }
    }
    int maxx = -INF;
    for(int i = 1 ; i <= n ; ++i){
        if(dp[i] > maxx && dp[i] <= n)maxx = dp[i];
    }
    printf("%d" , n - maxx);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值