日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[POI2005]BAN-Bank Notes

發布時間:2025/4/9 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [POI2005]BAN-Bank Notes 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

  Byteotian Bit Bank (BBB) 擁有一套先進的貨幣系統,這個系統一共有n種面值的硬幣,面值分別為b1, b2,…, bn. 但是每種硬幣有數量限制,現在我們想要湊出面值k求最少要用多少個硬幣.

  

  這一題其實很容易看出是一道背包問題,為什么我NOIP2018沒有想到,此題應該屬于多重背包問題,我們顯然可以,將f[i]定為拼出i元需要的最少鈔票數,將v定為花費的鈔票數,將w定為這些鈔票加起來的總價值,再利用多重背包的拆分方法。上鏈接已述,此處不多做敘述。

但重點在于怎樣記錄:一開始我的想法是將每個f[i]都記錄其轉移的來pre[i],輸出的時候向下不斷temp=pre[temp]來輸出。但這樣是不行的

錯誤代碼如下:

#include <algorithm> #include <iostream> #include <cmath> #include <cstring> #include <map> #include <string> #include <vector> #include <queue> #include <stack> #include <cstdio> #include <cstdlib> using namespace std; typedef long long ll; inline int read() {register int p(1),a(0);register char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if(ch=='-') p=-1,ch=getchar();while(ch>='0'&&ch<='9') a=a*10+ch-48,ch=getchar();return a*p; } const int N=210,M=20010; int n,m,f[M],b[N],biao[M][2],zh[M][N],pre[M],hole[N],c[N],temp=1; int main() {n=read();for(int i=1;i<=n;i++) b[i]=read();for(int i=1;i<=n;i++) c[i]=read();m=read();memset(f,0x3f,sizeof(f));f[0]=0;for(int i=1;i<=n;i++){temp=1;while((temp<<1)<=c[i]+1&&b[i]*temp<=m){for(int j=m;j>=b[i]*temp;j--) if(f[j]>f[j-b[i]*temp]+temp){f[j]=f[j-b[i]*temp]+temp;biao[j][0]=i,biao[j][1]=temp;pre[j]=j-b[i]*temp;}temp<<=1;}if((temp<<1)>=c[i]){temp=c[i]-temp+1;for(int j=m;j>=b[i]*temp;j--) if(f[j]>f[j-b[i]*temp]+temp){f[j]=f[j-b[i]*temp]+temp;biao[j][0]=i,biao[j][1]=temp;pre[j]=j-b[i]*temp;}}}printf("%d\n",f[m]);temp=m;while(temp){printf("%d ",temp);hole[biao[temp][0]]+=biao[temp][1];temp=pre[temp];}for(int i=1;i<=n;i++)printf("%d ",hole[i]); return 0; }

這樣做連樣例都過不了,我們考慮是為什么。首先我們考慮01背包為什么要倒敘循環,因為這樣就不會重復使用同一個物品。那么此算法的錯誤之處就出在這里。

樣例中要求拼出的數是10,有2 3 5三個數,其中5 只有一個,那么我們從f[10] ( f[m] ) 開始循環,我們首先取到5,于是我們接著我們循環f[5]這時我們就發現biao[5]在第循環5的時候被修改過了,所以它也用的是5這張鈔票,但5的鈔票只有一張,于是就出現錯誤了,顯然一維無法解決這個問題了,必須用二維。此題卡空間,int[3000][20000],消耗約228MB,而此題空間上限為64MB,而如果我們使用bool類型就可以過,我們用cun[i][j],表示在f[i][j]處是否發生轉移而下一個要循環的其實是可以算出來為f[i-1][j-w[i]],就這樣知道j為0為止

實現如下:

#include <algorithm> #include <iostream> #include <cmath> #include <cstring> #include <map> #include <string> #include <vector> #include <queue> #include <stack> #include <cstdio> #include <cstdlib> using namespace std; typedef long long ll; inline int read() {register int p(1),a(0);register char ch=getchar();while((ch<'0'&&ch>'9')&&ch!='-') ch=getchar();if(ch=='-') p=-1,ch=getchar();while(ch>='0'&&ch<='9') a=a*10+ch-48,ch=getchar();return a*p; } const int N=210,M=20010,N2=3010; int n,m,f[M],b[N],v[N2],w[N2],bef[N2],hole[N],c[N],temp=1,cnt=0,ji=0; bool cun[N2][M]; int main() {n=read();for(int i=1;i<=n;i++) b[i]=read();for(int i=1;i<=n;i++) c[i]=read();m=read();memset(f,0x3f,sizeof(f));f[0]=0;for(int i=1;i<=n;i++){temp=1;while((temp<<1)<=c[i]+1&&b[i]*temp<=m){v[++cnt]=temp;w[cnt]=b[i]*temp;bef[cnt]=i;temp<<=1;}if((temp<<1)>=c[i]){temp=c[i]-temp+1;v[++cnt]=temp;w[cnt]=b[i]*temp;bef[cnt]=i;temp<<=1;}}for(int i=1;i<=cnt;i++)for(int j=m;j>=w[i];j--){if(f[j]>f[j-w[i]]+v[i]){f[j]=f[j-w[i]]+v[i];cun[i][j]=true;}}printf("%d\n",f[m]);temp=m,ji=cnt;while(temp){while(!cun[ji][temp]&&ji) --ji;temp-=w[ji];hole[bef[ji]]+=v[ji];--ji;}for(int i=1;i<=n;i++)printf("%d ",hole[i]); return 0; }

?

轉載于:https://www.cnblogs.com/cold-cold/p/10015491.html

總結

以上是生活随笔為你收集整理的[POI2005]BAN-Bank Notes的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 丰满人妻一区二区三区免费视频棣 | 亚洲资源av | av第一页 | 五月婷婷天堂 | 中文字幕亚洲高清 | 好吊视频一二三区 | 日本无遮挡边做边爱边摸 | 欧美激情视频一区二区 | 欧美性xxxxx 亚洲特黄一级片 | 亚洲黄网av| 一级成人免费视频 | 亚洲精品高清无码视频 | 久一在线视频 | 色偷偷人人澡人人爽人人模 | 欧美一线天 | av在线导航| 高清av在线 | 国产乱人乱偷精品视频 | 97人人爽人人 | 十大污网站 | 朝桐光一区二区三区 | 大象传媒成人在线观看 | 老鸭窝成人 | 成人免费影片 | 97插插插 | aaaa毛片| 97久久人国产精品婷婷 | 欧美18免费视频 | 欧美日韩在线观看免费 | 爆操女秘书 | 青春草在线视频观看 | 国产精品av在线播放 | 国产精品一区二区黑人巨大 | 日本中文字幕二区 | 可以免费看毛片的网站 | 五月天社区 | 依依激情网 | 色呦呦免费观看 | 久久久久99精品 | 五十路黄色片 | 久久黄色录像 | 国产一区一一区高清不卡 | 国产亚洲精品久久777777 | 黑人巨茎大战欧美白妇 | 国产情侣自拍小视频 | 污导航在线 | 日本一区欧美 | 美女靠逼视频网站 | 亚洲中文字幕一区二区在线观看 | 国产欧美日韩高清 | 中国少妇av | 97成人资源| 91毛片在线观看 | 婷婷精品一区二区三区 | 亚洲女同一区二区 | 男性影院 | 午夜精品福利在线观看 | 亚洲欧美国产毛片在线 | 中日韩av电影 | 亚洲 欧美 变态 另类 综合 | 亚洲综合激情五月久久 | 欧美性生交大片免费看 | 欧美成人国产精品一区二区 | αv在线| 午夜av在线| 免费观看在线视频 | 久久精品99 | 日本精品一区视频 | 69精品人人人人 | 奇米成人网 | 男女啪动最猛动态图 | 色撸撸在线 | 伊人激情影院 | 九九视屏 | 少妇一晚三次一区二区三区 | 国产欧美一区二区精品久久久 | 国产成人久久777777 | 亚洲av无码一区二区三区性色 | 亚洲福利电影 | 撸撸在线视频 | jlzzzjlzzz国产免费观看 | 亚洲精品无码久久 | 欧美大片免费看 | 一级特黄性色生活片 | 精品麻豆一区二区 | 99999视频 | 台湾男男gay做爽爽的视频 | 日本三级大片 | 欧美精品自拍偷拍 | 小敏的受孕日记h | 天天视频天天爽 | 欧美一级网址 | 性生活毛片 | 色婷婷av一区二区三区在线观看 | 91热久久| 久久精品国产亚洲av嫖农村妇女 | 午夜宫 | 国产视频手机在线观看 | 成了校长的性脔h文 |