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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

1712: 最大乘积(贪心/dfs)

發布時間:2024/9/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1712: 最大乘积(贪心/dfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1712: 最大乘積
時間限制: 1 Sec 內存限制: 128 MB

[提交][狀態][討論版]
題目描述
對于n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?
輸入
第一行一個數表示數據組數
每組輸入數據共2行:
第1行給出總共的數字的個數n和要取的數的個數m,1<=n<=m<=15,
第2行依次給出這n個數,其中每個數字的范圍滿足:a[i]的絕對值小于等于4。
輸出
每組數據輸出1行,為最大的乘積。
樣例輸入

1 5 5 1 2 3 4 2

樣例輸出

48

提示
來源
/*
1.直接貪心。

序列中可能有負數。
明確一點,如果是負數,必須一次取一對負數,這樣保證每次取的盡可能是正數。

因為要使乘積最大,那么先對原序列排個序。
每次取前兩個和后兩個,分別算出它們的乘積,比較它們哪對乘積更大,
只要需要的序列個數大于兩個,
那么就取乘積更大的一對,取了的相當于刪掉了,
重復上述操作,直到需要的序列個數小于2,
如果此時還需要,
那么最后肯定是取當前剩下序列中最大的那一個
(即如果之前排的升序,即剩下序列中最后一個)

2.直接dfs暴搜。
加一個可行性剪枝。
即當前位置之后(包括當前位置)剩余元素個數小于還需要的個元素個數直接return
*/
way1:

#include <bits/stdc++.h> using namespace std; int main() {ios::sync_with_stdio(false);int t;cin>>t;while(t--){int n,m;cin>>n>>m;int a[n+2];int temp = 1;for(int i = 1; i <= n; i++){cin>>a[i];}sort(a+1,a+n+1);int ans = 1;int pos1 = 2,pos2 = n-1;while(m >= 2){if(a[pos1]*a[pos1-1] >= a[pos2]*a[pos2+1]){ans *= a[pos1] * a[pos1-1] ;pos1 += 2;}else{ans *= a[pos2] * a[pos2+1];pos2 -= 2;}m -= 2;}if(m){ans *= a[pos2+1];}cout<<ans<<endl;}return 0; }

way2:

#include <bits/stdc++.h> using namespace std; int n,m,ans; int a[20]; bool vis[20]; void dfs(int s,int cnt,int sum) {if(n-s+1 < m-cnt)return;if(cnt == m){ans = max(ans,sum);return;}for(int i = s; i <= n; i++){if(!vis[i]){vis[i] = true;dfs(i+1,cnt+1,sum*a[i]);//遞歸起始位置不要寫成了s+1,而是i+1!!!!vis[i] = false;}} } int main() {int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);ans = -(1<<30);memset(vis,false,sizeof(vis));for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}dfs(1,0,1);printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的1712: 最大乘积(贪心/dfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

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