給定n個正數,從中選出k個數,令其和為s,求選數的方案數。
對於每乙個數選擇與不選擇都進行dfs
邊界條件:
選中k個數且和為s
選中數的個數大於k
選中數的和大於s
要選的數越界了
#include
using
namespace std;
int ans =0;
int a[
2000];
int n,k,s;
void
choice
(int i,
int sum,
int chosen)
if(i >= n || sum <
0|| chosen > k)
return
; chosen++
;choice
(i+1
, sum - a[i]
, chosen)
; chosen--
;choice
(i+1
, sum, chosen);}
intmain()
return0;
}
數軸上有 n
nn 個閉區間[ai
,bi]
[a_i, b_i]
[ai,b
i]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)
對於每乙個區間按區間的右端點進行公升序排序,隨後進行遍歷,對於遍歷到第乙個左端點大於當前選中區間的右端點時,選中當前遍歷區間,並對ans++,繼續遍歷。
本題使用了貪心策略:每次取當前未被覆蓋區間中右端點最前的區間的右端點。
#include
using
namespace std;
struct edge edges[
200]
;bool
cmp(edge e1, edge e2)
intmain()
sort
(edges, edges + n, cmp)
;int ans =
1, cho =0;
for(
int i =
1; i < n; i++)}
cout << ans << endl;
return0;
}
數軸上有 n(1
<=n
<
=25000
)n (1<=n<=25000)
n(1<=n
<=2
5000
)個閉區間 [ai
,bi]
[a_i, b_i]
[ai,b
i],選擇盡量少的區間覆蓋一條指定線段 [1,
t](1
<=t
<=1
,000
,000
)[1, t]( 1<=t<=1,000,000)
[1,t](
1<=t
<=1
,000
,000
)。覆蓋整點,即(1,
2)+(
3,4)
(1,2)+(3,4)
(1,2)+
(3,4
)可以覆蓋(1,
4)
(1,4)
(1,4)。
不可能辦到輸出−1-1
−1將所有區間按照左端點公升序排序,在每次選取區間時都固定乙個起點,遍歷區間尋找左端點小於起點的區間中右端點-起點的長度最長的區間,並以這個區間的右端點作為新的起點。
細節: 由於只需覆蓋整點,所以在遍歷區間時尋找左端點小於起點+opop
op的區間,opop
op在第一輪遍歷時為0,之後置為1。
#include
#include
#include
#include
using
namespace std;
int n,t;
struct edge edges[
1000000];
bool
cmp(edge e1, edge e2)
void
solve()
int len =0;
for(
; i < n; i++)}
else
break;}
if(len ==0)
else
op =1;
}}intmain()
sort
(edges, edges + n, cmp)
;solve()
;memset
(edges,0,
sizeof
(edges));
}return0;
}
程式設計思維與實踐 Week3 作業
b 區間選點 貪心 c 區間覆蓋問題 貪心 給出n個正數,從其中選出k個數,使其總和為s,問 有多少種選數方案?input 第一行是正數t t 100 表示測試的組數。每一組都輸入兩行,第一行是三個整數n,k,s,第二行是n個正整數。output 每一組輸出結果佔一行,為方案的數目。sample i...
程式設計思維與實踐 week3
題目 題意 給定n個正整數,要求選出k個數,使選出來的k個數和為sum,共有多少個方案?輸入 第一行乙個數t t 100 表示有t組測試資料。接下來的兩行,一行有三個數n,k,s,一行有n個正整數。輸出 每組資料輸出乙個和為s的方案個數,每組佔一行。思路 dfs 可行性剪枝 子集列舉問題。列舉所有子...
程式設計思維與實踐 Week3 作業 B區間選點
題意 數軸上有n個閉區間,在數軸上選取盡量少的點,使得每個區間上都有乙個點,其中乙個點可以覆蓋多個區間。思路 將各個點用結構體記錄下來,分別記錄下左右邊界。不妨設左端點為a,右端點為b。對這些點進行排序,然後將區間按b 從小到大排序 b 相同時a 從大到小排序 然後從前往後進行選點,點為選擇前乙個區...