題目大意:
給你一個罐子的承受重量V,然後給你n種金幣,每一種金幣有兩個屬性,價值C[i]和重量W[i],每一種金幣有無限個。
然後讓你判斷是否能用罐子裝重量爲V的金幣,如果能,請輸出重量爲V時金幣的最小价值。
題解:
完全揹包模板題,不過要注意初始化問題,在揹包九講裏面也都講了,不懂的自行百度。
trick:注意數組要開大點,不然會TLE,記住是TLE,具體原因和後臺linux系統有關。
代碼實現:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e4+7; int C[N],W[N]; int dp[N]; int main(){ int T=read(); while(T--){ int e=read(),f=read(); int V=abs(f-e); int n=read(); rp(i,1,n) C[i]=read(),W[i]=read(); mst(dp,INF); dp[0]=0; int cnt=0; // rp(i,1,n){ // if(W[i]>V) continue; // int flag=0; // rp(j,1,cnt){ // if(W[j]>=W[i]&&C[j]<=C[i]) // flag=1; // if(flag) continue; // C[++cnt]=C[i]; // W[cnt]=W[i]; // } rp(i,1,n) rp(j,W[i],V) dp[j]=min(dp[j-W[i]]+C[i],dp[j]); if(dp[V]!=INF) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[V]); else printf("This is impossible.\n"); } return 0; } /* 1 7 3 3 3 6 6 2 2 */
dp訓練計劃——完全揹包板子題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.