DP之多重揹包

2021-08-20 06:11:41 字數 1800 閱讀 2504

description

給定n種物品和乙個容量為c的揹包,第i種物品最多有mi件可用,每件的重量是wi,價值是vi。問:將哪些物品裝入揹包可使這些物品的重量總和不超過揹包容量,且價值總和最大。

input

輸入的第一行為測試樣例的個數t,接下來有t個測試樣例。

每個測試樣例的第一行是物品種數n(1 ≤n≤ 100)和揹包容量cc≤ 10000)。

接下來n行,每行三個正整數,wivimiwi≤ 10000,vi≤ 10000,mi≤ 10000 ),分別表示第i種物品的重量wi,價值vi,及個數mi

output

對應每個測試樣例輸出一行,只有乙個整數,表示裝入揹包的物品總價值的最大值。

sample input

1

2 84 100 2

2 100 4

sample output

400

**如下:

#include///oj1943

#include#includeusing namespace std;

const int max=20000;

int dp[max],w[max],v[max];

int main()

if(times>0)

}memset(dp,0,sizeof(dp));

for(int i=1;i=w[i];j--)

dp[j]=max(dp[j],dp[j-w[i]]+v[i]);

}printf("%d\n",dp[c]);

}return 0;

}

這裡還可用深搜解決:

#include///深搜

#include#includeusing namespace std;

int num[7],flag,sum;

void dfs(int s,int tot)

if(flag==1) return;

for(int i=6;i>0;i--)///相當於列舉,從最後開始,假設num[i]有n個,那麼會遞迴呼叫開闢n個空間,每個空間的s值為}}

return;

}int main()

if(sum==0) break;

printf("collection #%d:\n",ncase);

if(sum%2)

sum/=2;///注意除以2

flag=0;

dfs(0,6);

if(flag) printf("can be divided.\n\n");

else printf("can't be divided.\n\n");

}return 0;

}

dp 揹包之多重揹包

問題 多重揹包也是 0 1 揹包的乙個變式。與 0 1 揹包的區別在於每種物品有ki個,而非乙個。解決方案 將k個相同的物品,看作k個不同的物品,但是wi,ci都一樣。即可套用 01揹包方案 詳見 優化方法 二進位制優化 設k個物品分成 a xx a xx 1 a xx k 1 個物品。那麼 a x...

dp2之多重揹包

沉浸在揹包的世界裡不能自拔 多重揹包在完全揹包的基礎上公升級為每個種類的東西的數目是有限的 多重揹包裸題 ac include using namespace std include include int main if c i 0 for i 1 i index i cout v i w i e...

揹包問題之多重揹包

相比完全揹包問題,多重揹包指定物品個數。我們可以將多重揹包問題轉化為0 1揹包 容易超時,優化後續補充 進行處理。求最好價值問題的多重揹包不能使用記錄使用物品次數的方式進行簡化 題目給定一些不同價值的硬幣,求這些硬幣可以組成1 n範圍內值的數量。public int backpack int n,i...