【一堆的背包水题】沉迷于刷水无可救药~
我在干嘛,连普及组都不会考这种题。以三四分钟一道题的速度混了一下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