多重部分和問題
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
233 5 8
3 2 2172
1 21 1
4
sample output
original
transformed
yesno
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...