背包模板
来源:互联网 发布:淘宝网店客服中心 编辑:程序博客网 时间:2024/05/23 19:17
模板:
-
-
-
-
-
-
- #include <iostream>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define maxn 100005
- int c[maxn], w[maxn], num[maxn];
- int dp[maxn];
- int V;
-
-
- void ZeroOnePack(int c, int w)
- {
- for (int v = V; v >= c; v--)
- {
- dp[v] = max(dp[v], dp[v - c] + w);
- }
- }
-
- void CompletePack(int c, int w)
- {
- for (int v = c; v <= V; v++)
- {
- dp[v] = max(dp[v], dp[v - c] + w);
- }
- }
-
- void MultiplePack(int c, int w, int num)
- {
- if (c * num >= V)
- {
- CompletePack(c, w);
- }
- else
- {
- int k = 1;
- while (k < num)
- {
- ZeroOnePack(k*c, k*w);
- num -= k;
- k <<= 1;
- }
- ZeroOnePack(num*c, num*w);
- }
- }
- int main()
- {
- int t;
- cin>>t
- while (t--)
- {
- int n;
- scanf("%d%d", &V, &n);
- for (int i = 1; i <= n; i++)
- cin>>c[i]>>w[i]>>num[i];
- memset(dp, 0, sizeof(dp));
- for (int i = 1; i <= n; i++)
- MultiplePack(c[i], w[i], num[i]);
- cout<<dp[V];
- }
- return 0;
- }
01背包:
-
-
-
-
-
-
-
-
- #include<iostream>
- #define N 1000005
- #include<algorithm>
- #include<cstring>
- using namespace std;
- int w[N],v[N],dp[N];
- int main()
- {
- int i, j, n, m;
- while(cin>>n)
- {
- cin>>m;
- memset(dp,0,sizeof(dp));
- for(i=0; i<n; i++)
- cin>>w[i]>>v[i];
- for(i=0; i<n; i++)
- {
- for(j=m; j>=w[i]; j--)
- dp[j] = max(dp[j], dp[j-w[i]]+v[i]);
- }
- cout<<dp[m];
- }
- return 0;
- }
完全背包:-
-
-
-
-
-
- #include <iostream>
- #include <algorithm>
- #define INF 0x3fffffff
- #define N 10047
- using namespace std;
- int dp[N],v[N],w[N];
- int main()
- {
- int t,i,j,k,e,f,m,n;
- cin>>t;
- while(t--)
- {
- cin>>e>>f;
- int c = f-e;
- for(i = 0 ; i <= c ; i++)
- dp[i]=INF;
- cin>>n;
- for(i = 0 ; i < n ; i++)
- {
- cin>>v[i]>>w[i];
- }
- dp[0]=0;
-
-
-
- for(i =0 ; i < n ; i++)
- {
- for(j = w[i] ; j <= c ; j++)
- {
- dp[j] = min(dp[j],dp[j-w[i]]+v[i]);
- }
- }
- if(dp[c] == INF)
- printf("This is impossible.\n");
- else
- printf("The minimum amount of money in the piggy-bank is %d.\n",dp[c]);
- }
- return 0;
- }
-
多重背包:-
-
-
-
-
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #define N 1005
- using namespace std;
- int main()
- {
- int t,n,m,i,j,k;
- int w[N],pri[N],num[N],dp[N];
- while(cin>>t)
- {
- while(t--)
- {
- memset(dp,0,sizeof(dp));
- cin>>n>>m;
- for(i = 0 ; i < m ; i++)
- {
- cin>>pri[i]>>w[i]>>num[i];
- }
- for(i = 0 ; i < m ; i++)
- {
- for(j = 0 ; j < num[i] ; j++)
- {
- for(k = n ; k >= pri[i]; k--)
- {
- dp[k] = max(dp[k],dp[k-pri[i]]+w[i]);
- }
- }
- }
- cout<<dp[n]<<endl;
- }
- }
- return 0;
- }