首页 > 代码库 > 【一堆的背包水题】沉迷于刷水无可救药~

【一堆的背包水题】沉迷于刷水无可救药~

我在干嘛,连普及组都不会考这种题。以三四分钟一道题的速度混了一下BZOJ的题目数量。

BZOJ1606: [Usaco2008 Dec]Hay For Sale 购买干草

裸的01背包。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN=5000+5;
 4 const int MAXC=50000+50;
 5  
 6 int main()
 7 {
 8     int c,h,v[MAXN],f[MAXC];
 9     scanf("%d%d",&c,&h);
10     memset(f,0,sizeof(f));
11     for (int i=1;i<=h;i++)
12     {
13         scanf("%d",&v[i]);
14         for (int j=c;j>=v[i];j--) f[j]=max(f[j],f[j-v[i]]+v[i]);
15     }
16     printf("%d",f[c]);
17     return 0;
18 } 

BZOJ1625: [Usaco2007 Dec]宝石手镯

裸的01背包again……注意一下里面的小注释……

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN=12880+5;
 4  
 5 int main()
 6 {
 7     int dp[MAXN],n,m;
 8     memset(dp,0,sizeof(dp));//如果需要恰巧装满,则dp[0]=0,dp[else]=-INF
 9     scanf("%d%d",&n,&m);
10     for (int i=1;i<=n;i++)
11     {
12         int w,d;
13         scanf("%d%d",&w,&d);
14         for (int j=m;j>=w;j--) dp[j]=max(dp[j],dp[j-w]+d);
15     }
16     printf("%d",dp[m]);
17     return 0;
18 } 

 

BZOJ1677: [Usaco2005 Jan]Sumsets 求和

裸的完全背包。以前写过一个递推版本的。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int MAXN=1000000+50;
 8 const int MOD=1e9;
 9  
10 int main()
11 {
12     int n;
13     scanf("%d",&n);
14     int k=1,dp[MAXN];
15     memset(dp,0,sizeof(dp));
16     dp[0]=1;
17     while (k<=n)
18     {
19         for (int v=k;v<=n;v++) dp[v]=(dp[v]+dp[v-k])%MOD;
20         k=k*2;
21     }
22     printf("%d",dp[n]%MOD);
23     return 0;
24 }

 

BZOJ1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店

裸的完全背包,加了高精度。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=1000+50;
 7 int f[MAXN][MAXN];
 8  
 9 void add(int a,int b)
10 {
11     int lena=f[a][0],lenb=f[b][0];
12     int len=max(lena,lenb);
13     int i,rem=0;
14     for (i=1;i<=len || rem;i++)
15     {
16         rem=(f[a][i]+f[b][i])/10;
17         f[a][i]+=f[b][i];
18         f[a][i]%=10;
19         f[a][i+1]+=rem;
20     }
21     f[a][0]=i-1;
22 }
23  
24 int main()
25 {
26     int n,k;
27     scanf("%d%d",&n,&k);
28     memset(f,0,sizeof(f));
29     f[0][0]=f[0][1]=1;
30     for (int i=1;i<=k;i++)
31         for (int j=i;j<=n;j++) add(j,j-i);
32     for (int i=f[n][0];i>=1;i--) printf("%d",f[n][i]);printf("\n");
33     return 0;
34 } 
35 

 

【一堆的背包水题】沉迷于刷水无可救药~