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;
}