在洛谷上发现了一个背包问题的题单,觉得很好,就做了一下。
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; }
|