今天广州下雨啦,不过没关系啦,反正我最近也都在刷题学习算法。
昨天做了五题01背包,今天还是背包,不过是完全背包,估计做动态规划要持续好一段时间,一开始选了一道简单题目啦。
HDU1114,看了小一段时间,动手打代码,测调后感觉很NICE,交上去就WA了。
后来,是我的MAX值给得太小了。果断加两个零,马上就A掉了。
完全背包的思路和01背包很相似,就是在循环时候有点不同。
01背包的是:
memset(dp,0,sizeof(dp)); memset(v,0,sizeof(v)); memset(w,0,sizeof(w)); for(i=1;i<=n;i++) for(j=V;j>=v[i];j--) //v是volume,w是weight dp[j]=max{dp[j],dp[j-v[i]]+w[i] }
完全背包是:
memset(dp,0,sizeof(dp)); memset(v,0,sizeof(v)); memset(w,0,sizeof(w)); for(i=1;i<=n;i++) for(j=v[i];j<=V;j++) //循环不同 dp[j]=max{dp[j],dp[j-v[i]]+w[i] }
附上代码
/*******************************************************************************/ /* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux * Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) * Encoding : UTF8 * Date : 2014-03-09 * All Rights Reserved by yaolong. *****************************************************************************/ /* Description: complete package********************************************* *****************************************************************************/ /* Analysis: ****************************************************************** *****************************************************************************/ /*****************************************************************************/ //* #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAX_N 1000003 int v[MAX_N],w[MAX_N],dp[MAX_N]; int min(int a,int b){ return a>b?b:a; } int main(){ // freopen("in.txt","r",stdin); int cases,E,F,N,i,j,W; cin>>cases; while(cases--){ cin>>E>>F; cin>>N; W=F-E; memset(v,0,sizeof(v)); memset(w,0,sizeof(w)); for(i=1;i<=W;i++){ dp[i]=MAX_N; } dp[0]=0; for(i=1;i<=N;i++){ cin>>v[i]>>w[i]; } for(i=1;i<=N;i++) for(j=w[i];j<=W;j++){ dp[j]=min(dp[j],dp[j-w[i]]+v[i]); } if(dp[W]!=MAX_N){ cout<<"The minimum amount of money in the piggy-bank is "<<dp[W]<<"."<<endl; }else{ cout<<"This is impossible."<<endl; } } // fclose(stdin); return 0; }