knapsack

发布 : 2022-03-25 分类 : 算法 浏览 :

在洛谷上发现了一个背包问题的题单,觉得很好,就做了一下。

01背包

P1049 装箱问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define ios \
ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0)
#define V 20010
#define N 35
int v,n,ans;
int dp[V],w[N];
int main(){
ios;
scanf("%d%d",&v,&n);
for(int i=1;i<=n;++i)
scanf("%d",&w[i]);
dp[0]=1;
for(int i=1;i<=n;++i)
for(int j=v;j>=w[i];--j)
if(dp[j-w[i]]){
dp[j]=1;
ans=max(ans,j);
}
printf("%d\n",v-ans);
return 0;
}

P1164 小A点菜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define ios \
ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0)
#define V 20010
#define N 110
int n,m;
int a[N],dp[N];
int main(){
ios;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
dp[0]=1;
for(int i=1;i<=n;++i)
for(int j=m;j>=a[i];--j)
dp[j]+=dp[j-a[i]];
printf("%d\n",dp[m]);
return 0;
}
本文作者 : preccrep
原文链接 : https://preccrep.github.io/2022/03/25/knapsack/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹

博客已萌萌哒运行(●'◡'●)ノ♥
Theme - BMW | Made With 💗 | Powered by GodBMW