多重部分和問題(dp 2023年安徽省賽)

2021-07-30 23:13:45 字數 1438 閱讀 4379

多重部分和問題

time limit: 10000 ms   memory limit: 256 mb

total submission: 40   submission accepted: 17

description

有n種不同大小的數字,每種各個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。

input

首先是乙個正整數t(1<=t<=100)

接下來是t組資料

每組資料第一行是乙個正整數n(1<=n<=100),表示有n種不同大小的數字

第二行是n個不同大小的正整數ai(1<=ai<=100000)

第三行是n個正整數mi(1<=mi<=100000),表示每種數字有mi個

第四行是乙個正整數k(1<=k<=100000)

output

對於每組資料,如果能從這些數字中選出若干使它們的和恰好為k,則輸出「yes」,否則輸出「no」,每個輸出單獨佔一行

sample input

original

transformed

2

33 5 8

3 2 2172

1 21 1

4

sample output

original

transformed

yes

no

source

安徽省2023年「京勝杯」大學生程式設計競賽

題目大意:中文題目。

題目分析:就是乙個多重揹包的問題,然後做這題得到的乙個感覺就是,做dp題,就是應該用dp的思路去求解。最外層迴圈數字的種類,內層迴圈數字。dp【i+1】【j】代表 組成數字j後第i種數字還剩下的個數。然後就有以下幾種情況:

一:   前i-1種數字已經可以組成數字j了,所以此時第i種數字還剩下m【i】個,沒有使用。

二:  前i種數字組成j-a【i】已經不剩餘了,或者a【i】大於j

三:其他情況。

**一:這是用二維陣列的

#include #include #include #include using namespace std;

const int maxn = 100005;

int a[maxn],m[maxn];

int dp[100][100005];

int main()

} if(dp[n+1][k]>=0)

cout<<"yes"<

#include #include #include #include using namespace std;

const int maxn = 100005;

int a[maxn],m[maxn];

int dp[100005];

int main()

} if(dp[k]>=0)

cout<<"yes"<

多重部分和問題 DP

這題是挑戰程式設計競賽上的。題意 n個不同的數字,每個有xi個,要恰好組成k這個數是否可能.如果單純用dp i j 表示前i種數,和為j是否可能,那麼轉移方程就是 dp i j dp i j dp i 1 j k a i k min j a i x i 複雜度為o n 3 如果利用多重揹包二進位制的...

多重部分和問題

有 n 種物品,第i種物品的每個物品的價值是 ai 數目是 mi 判斷是否可以選擇若干數字使得價值和是k。1 n 100 1 ai,m i,10 5 1 k 105 看作揹包大小是k,物品的價值和體積都是ai 物品數目是 mi 的多重揹包。如果最大價值是 k 的話就是可以選出,否則便是不能選出。利用...

多重部分和問題

有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。dp i 表示以a i 為末尾的最長上公升子串行的長度。include include include includeusing namespace std define maxn 10010 int...