多重部分和問題

2021-07-15 04:46:42 字數 839 閱讀 8820

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

限制條件:1<=n<=100,1<=a[i],m[i]<=100000,1<=k<<100000

這個問題可以用dp求解,如何定義遞推式影響最後的時間複雜度。

定義dp[i+1][j]:用前i+1種數字(數字的編號是從0到i)是否能加成j

為了用前i+1種數字加成j,就需要能前i種數字加成j,j-a[i],……,j-m[i]*a[i]的一種。

因此有以下遞推式:dp[i+1][j]=(0<=k《可以寫出如下**:

int n;

int k;

int a[100005];

int m[100005];

bool dp[105][100005];

void solve()

{ dp[0][0]=true;

for(int i=0;i=0)

dp[i+1][j]=-1(j=0是否成立即可。
這個遞推式可以在o(nk)的時間內算出結果,同時考慮陣列重複利用,可寫出如下**:

int n;

int k;

int a[100005];

int m[100005];

int dp[100005];

void solve()

{ dp[0]=0;

for(int i=0;i=0) dp[j]=m[i];

else if(j=0) cout<<"yes"<

多重部分和問題

有 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...

多重部分和問題

1149 多重部分和問題 時間限制 1 sec 記憶體限制 128 mb 提交 25 解決 6 提交 狀態 討論版 題目描述 有n中不同大小的數字ai,每種各mi個。判斷是否可以從這些數字之中選出若干使他們的大小恰好為k.限制條件 1 n 100 1 ai,mi 100000 1 k 100000 ...