1712: 最大乘积(贪心/dfs)
生活随笔
收集整理的這篇文章主要介紹了
1712: 最大乘积(贪心/dfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1712: 最大乘積
時間限制: 1 Sec 內存限制: 128 MB
[提交][狀態][討論版]
題目描述
對于n個數,從中取出m個數,如何取使得這m個數的乘積最大呢?
輸入
第一行一個數表示數據組數
每組輸入數據共2行:
第1行給出總共的數字的個數n和要取的數的個數m,1<=n<=m<=15,
第2行依次給出這n個數,其中每個數字的范圍滿足:a[i]的絕對值小于等于4。
輸出
每組數據輸出1行,為最大的乘積。
樣例輸入
樣例輸出
48提示
來源
/*
1.直接貪心。
序列中可能有負數。
明確一點,如果是負數,必須一次取一對負數,這樣保證每次取的盡可能是正數。
因為要使乘積最大,那么先對原序列排個序。
每次取前兩個和后兩個,分別算出它們的乘積,比較它們哪對乘積更大,
只要需要的序列個數大于兩個,
那么就取乘積更大的一對,取了的相當于刪掉了,
重復上述操作,直到需要的序列個數小于2,
如果此時還需要,
那么最后肯定是取當前剩下序列中最大的那一個
(即如果之前排的升序,即剩下序列中最后一個)
2.直接dfs暴搜。
加一個可行性剪枝。
即當前位置之后(包括當前位置)剩余元素個數小于還需要的個元素個數直接return
*/
way1:
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1715: 序列变换(LIS变形)
- 下一篇: 1730: 数区间(线段覆盖,贪心)