bzoj1021 [SHOI2008]Debt 循环的债务(dp)
2018-03-28 15:02
253 查看
这题好难啊orz
我们考虑这个问题其实就是一开始A,B,C分别有sa,sb,sc的钱,总共n元,经过一波py,目标状态的A,B,C分别有ea,eb,ec的钱。问最少需要交换几张钱。
我们一种面额一种面额的考虑,显然不同面额之间互不影响。(而且你考虑的顺序其实可以是任意的,所以你可以按照张数从小到大来做。)
我们考虑dp,f[k][i][j],表示考虑前k种面额,A现在有i元,B现在有j元最少需要交换几张。(显然此时C有n-i-j元,不用记录这一维状态)我们现在考虑第k+1种面额,枚举py之后A有a张,B有b张,c有tot-a-b张,能转移到的状态可以直接计算,交换张数也可以直接计算。
我们考虑这个问题其实就是一开始A,B,C分别有sa,sb,sc的钱,总共n元,经过一波py,目标状态的A,B,C分别有ea,eb,ec的钱。问最少需要交换几张钱。
我们一种面额一种面额的考虑,显然不同面额之间互不影响。(而且你考虑的顺序其实可以是任意的,所以你可以按照张数从小到大来做。)
我们考虑dp,f[k][i][j],表示考虑前k种面额,A现在有i元,B现在有j元最少需要交换几张。(显然此时C有n-i-j元,不用记录这一维状态)我们现在考虑第k+1种面额,枚举py之后A有a张,B有b张,c有tot-a-b张,能转移到的状态可以直接计算,交换张数也可以直接计算。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 50 inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n,sa,sb,sc,numa[7],numb[7],numc[7],ea,eb,ec,tot[7],f[7][1010][1010]; int val[7]={0,1,5,10,20,50,100}; inline int cal(int a,int b,int k){//考虑第k种面额,最后A有a张,B有b张,c有tot-a-b张,需要交换几张达到。 return abs(a-numa[k])+abs(b-numb[k])+abs(tot[k]-a-b-numc[k])>>1; } int main(){ // freopen("a.in","r",stdin); int x1=read(),x2=read(),x3=read(); for(int i=6;i>=1;--i) numa[i]=read(),tot[i]+=numa[i]; for(int i=1;i<=6;++i) sa+=val[i]*numa[i]; for(int i=6;i>=1;--i) numb[i]=read(),tot[i]+=numb[i]; for(int i=1;i<=6;++i) sb+=val[i]*numb[i]; for(int i=6;i>=1;--i) numc[i]=read(),tot[i]+=numc[i]; for(int i=1;i<=6;++i) sc+=val[i]*numc[i]; n=sa+sb+sc;ea=sa-x1+x3;eb=sb+x1-x2;ec=sc+x2-x3; memset(f,inf,sizeof(f));f[0][sa][sb]=0; for(int k=0;k<6;++k){ for(int i=0;i<=n;++i) for(int j=0;i+j<=n;++j){ if(f[k][i][j]==inf) continue; for(int a=0;a<=tot[k+1];++a) for(int b=0;b+a<=tot[k+1];++b){ int ii=i+val[k+1]*(a-numa[k+1]),jj=j+val[k+1]*(b-numb[k+1]); if(ii>=0&&jj>=0&&ii+jj<=n) f[k+1][ii][jj]=min(f[k+1][ii][jj],f[k][i][j]+cal(a,b,k+1)); } } }if(f[6][ea][eb]==inf) puts("impossible"); else printf("%d\n",f[6][ea][eb]); return 0; }
相关文章推荐
- BZOJ 1021 :[SHOI2008]Debt 循环的债务 (DP)
- BZOJ_1021_[SHOI2008]_Debt循环的债务_(DP)
- [bzoj1021][SHOI2008]Debt 循环的债务【dp】
- BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )
- bzoj1021 [SHOI2008]Debt 循环的债务
- 1021: [SHOI2008]Debt 循环的债务 - BZOJ
- 【BZOJ 1021】 [SHOI2008]Debt 循环的债务
- [bzoj1021][SHOI2008]Debt 循环的债务 (动态规划)
- 【BZOJ 1021】[SHOI2008]Debt 循环的债务
- [bzoj1021][SHOI2008]Debt 循环的债务
- BZOJ 1021 [SHOI2008]Debt 循环的债务
- BZOJ.1021.[SHOI2008]循环的债务(DP)
- [BZOJ1021][SHOI2008]Debt 循环的债务
- bzoj千题计划111:bzoj1021: [SHOI2008]Debt 循环的债务
- 【BZOJ】【1021】【SHOI2008】Dept循环的债务
- BZOJ1021 SHOI2008循环的债务
- BZOJ1021 [SHOI2008]循环的债务
- 1021: [SHOI2008]Debt 循环的债务
- [SHOI 2008]Debt 循环的债务
- 【dp】bzoj 1021 循环的债务