多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > ZOJ--3631--Watashi's BG【枚舉】

ZOJ--3631--Watashi's BG【枚舉】

來源:程序員人生   發布時間:2014-09-06 15:02:58 閱讀次數:2151次

鏈接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4777

題意:有n天,告訴你每天的花費,別人給你一筆資金m,你自己也有一部分資金(可以假設花不完),每天只能花自己的錢或者花資金m中的錢,不能混著花,問m最多能花多少?


思路:考慮到數據比較小,n最多只有30,可以用枚舉來做,枚舉每天花m或者不花m,二進制枚舉,復雜度2^30。這樣復雜度要超時的,土豪說可以分兩部分枚舉,把結果存入兩個數組,然后這兩個數組結果再合并,復雜度n^2,這樣二進制枚舉最多是兩個2^15,大大縮短了時間復雜度。

后來我又用dfs寫了一遍,果斷T,看了別人的代碼,有個剪枝很關鍵,當前已使用的資金與所有還未使用的資金相加如果小于等于已得到的最大值,則剪枝。


二進制枚舉代碼

#include<cstring> #include<string> #include<fstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cctype> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #include<ctime> #include<cstdlib> #include<functional> #include<cmath> using namespace std; #define PI acos(-1.0) #define MAXN 5000100 #define eps 1e-7 #define INF 0x7FFFFFFF #define LLINF 0x7FFFFFFFFFFFFFFF #define seed 131 #define MOD 1000000007 #define ll long long #define ull unsigned ll #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int a[200010],b[200010],va[40],vb[40]; int main(){ int i,j; int n,m; int la,lb,cnta,cntb,ans; while(scanf("%d%d",&n,&m)!=EOF){ la = lb = cnta = cntb = ans = 0; for(i=0;i<n/2;i++){ scanf("%d",&va[i]); la++; } for(i=n/2;i<n;i++){ scanf("%d",&vb[i-n/2]); lb++; } int l = (1<<la); for(i=0;i<l;i++){ int sum = 0; for(j=0;j<la;j++){ if(i&(1<<j)){ sum += va[j]; } } if(sum<=m){ a[cnta++] = sum; ans = max(sum,ans); } } l = (1<<lb); for(i=0;i<l;i++){ int sum = 0; for(j=0;j<lb;j++){ if(i&(1<<j)){ sum += vb[j]; } } if(sum<=m){ b[cntb++] = sum; ans = max(sum,ans); } } sort(a,a+cnta); sort(b,b+cntb); if(ans==m){ printf("%d ",ans); continue; } for(i=cnta-1;i>=0;i--){ for(j=cntb-1;j>=0;j--){ if(a[i]+b[j]<=m){ ans = max(ans,a[i]+b[j]); break; } } } printf("%d ",ans); } return 0; }


DFS代碼

#include<cstring> #include<string> #include<fstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cctype> #include<algorithm> #include<queue> #include<map> #include<set> #include<vector> #include<stack> #include<ctime> #include<cstdlib> #include<functional> #include<cmath> using namespace std; #define PI acos(-1.0) #define MAXN 5000100 #define eps 1e-7 #define INF 0x7FFFFFFF #define LLINF 0x7FFFFFFFFFFFFFFF #define seed 131 #define MOD 1000000007 #define ll long long #define ull unsigned ll #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int a[40],jz[40]; int n,m,maxm; void dfs(int step,int cnt){ if(cnt>m) return ; maxm = max(maxm,cnt); if(step<1) return ; if(cnt+jz[step]<=maxm) return ; //防TLE剪枝 dfs(step-1,cnt); dfs(step-1,cnt+a[step]); } int main(){ int i,j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=n;i++){ scanf("%d",&a[i]); } jz[0] = 0; for(i=1;i<=n;i++) jz[i] = jz[i-1] + a[i]; maxm = 0; dfs(n,0); printf("%d ",maxm); } return 0; }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 最近最新中文字幕在线手机版 | 高清欧美一区二区免费影视 | 亚洲 欧美综合小说区图片区 | 欧美非洲黑人性xxxx | 狠狠色伊人亚洲综合第8页 狠狠色综合网 | 国产视频一区在线 | 麻豆va一区二区三区久久浪 | 国产精品66福利在线观看 | 日韩精品一区二区三区在线观看l | 秋霞理论一级在线观看手机版 | 欧美日韩国产高清 | 久久久久色 | 波霸欧美性猛交xxxxxx | 久久精品国产欧美 | 亚洲一区日本 | 久久精品屋| 成人午夜免费在线观看 | 欧美极品欧美日韩 | 国产91精品久久久久久久 | 第一页在线观看 | 亚洲图片偷拍区 | 91嫩草私人成人亚洲影院 | 欧美俄罗斯一级毛片激情 | 国产午夜精品免费一二区 | 2021天天躁夜夜躁狠狠躁 | 2020久久精品亚洲热综合 | 在线不卡国产 | yellow中文字幕在线 | 亚洲第五页 | 日韩欧美中文字幕一区 | 日本1区2区3区电 | 日韩视频一 | 欧美操片| 国产精品96久久久久久久 | 国产成人精品一区二三区在线观看 | 亚洲一区二区三区久久久久 | 亚洲 欧美 另类 综合 日韩 | 亚洲国产成人久久一区www | 日韩欧美1区 | 高清日本一级特黄aa大片 | 国产精品网站 夜色 |