POJ --1170 -Shopping Offers--DP

来源:互联网 发布:专业麦克风 知乎 编辑:程序博客网 时间:2024/05/22 06:15

五维DP,蛋碎了,,很久不写题解的我也想记下这段优美的代码了

#include<iostream>#include<cstring>#include<cstdio>#define maxn 1000using namespace std;int code[6];//each item's codeint dcode[maxn];//dcode[code]=indexint num[6];//each item's numberint price[6];//each item's priceint sale_item_number[110][6];//each item's number in every special offerint sale_count[110],sale_price[110];//each special offer's item number and special costint n;//tot item in basketint pn;//the number of special offerint dp[6][6][6][6][6];//dp array ,what you understand;void init(){int coode,idx;cin>>n;for(int i=0;i<n;i++){cin>>code[i]>>num[i]>>price[i];dcode[code[i]]=i;}cin>>pn;memset(sale_item_number,0,sizeof(sale_item_number));for(int i=0;i<pn;i++){cin>>sale_count[i];for(int j=0;j<sale_count[i];j++){cin>>coode;idx=dcode[coode];cin>>sale_item_number[i][idx];}cin>>sale_price[i];}}void solve(){memset(dp,-1,sizeof(dp));int i0,i1,i2,i3,i4;int i,j;int & aim=dp[num[0]][num[1]][num[2]][num[3]][num[4]];aim=0;for(i=0;i<5;i++){aim+=num[i]*price[i];}dp[0][0][0][0][0]=0;for(i0=0;i0<=num[0];i0++){for(i1=0;i1<=num[1];i1++){for(i2=0;i2<=num[2];i2++){for(i3=0;i3<=num[3];i3++){for(i4=0;i4<=num[4];i4++){for(i=0;i<=pn;i++){ int & uv =dp[i0][i1][i2][i3][i4]; if(sale_item_number[i][0]>i0|| sale_item_number[i][1]>i1|| sale_item_number[i][2]>i2|| sale_item_number[i][3]>i3|| sale_item_number[i][4]>i4   )continue;     int bg= dp[i0-sale_item_number[i][0]]       [i1-sale_item_number[i][1]]     [i2-sale_item_number[i][2]]   [i3-sale_item_number[i][3]]   [i4-sale_item_number[i][4]];     if(bg<0)continue; int temp=sale_price[i]+bg;     if(uv==-1||temp<uv) { uv=temp; int res=uv+(num[0]-i0)*price[0]+ (num[1]-i1)*price[1]+ (num[2]-i2)*price[2]+ (num[3]-i3)*price[3]+ (num[4]-i4)*price[4]; if(aim==-1||res<aim) { aim=res; } } }}}}}}printf("%d\n",aim);}int main(){freopen("1170.txt","r",stdin);init();solve();return 0;}


原创粉丝点击