#include<iostream>#include<algorithm>usingnamespace std;#define MAX 1000+10intmain(){//變量和數組:int n, m;//n爲物品個數,m爲揹包最大容量int dp[MAX]={0};//dp[x]表示揹包容量爲x時的所裝物品的最大價值int w[7]={0};//物品的重量int v[7]={0};//物品的價值//賦值:
cin >> n >> m;for(int i =1; i <= n; i++){
cin >> w[i]>> v[i];if(w[i]> m){//如果物品的重量大於揹包容量,不考慮
i--;
n--;}}//初始化dp數組://裝滿的——只有0能裝滿0,其他的初始化爲負無窮
dp[0]=0;for(int i =1; i <= m; i++)
dp[i]=-99999;//不要求裝滿——所有的初始都爲0;
dp[MAX]={0};//核心代碼:for(int i =1; i <= n; i++)for(int j = m; j >= w[i]; j--)
dp[j]=max(dp[j], dp[j - w[i]]+ v[i]);//狀態轉移方程
cout << dp[m];return0;}
完全揹包:
#include<iostream>#include<algorithm>usingnamespace std;#define MAX 1000+10//變量和數組:int n, m;//n爲物品個數,m爲揹包最大容量int dp[MAX]={0};//dp[x]表示揹包容量爲x時的所裝物品的最大價值int w[7]={0};//物品的重量int v[7]={0};//物品的價值//優化函數booloptimize(int i){for(int x = i -1; x >=0; x--){if(w[i]>= w[x]&& v[i]<= v[x])//重量大但價值小的不考慮returntrue;}returnfalse;}intmain(){//賦值:
cin >> n >> m;for(int i =1; i <= n; i++){
cin >> w[i]>> v[i];if(w[i]> m ||optimize(i)){//如果物品的重量大於揹包容量,不考慮
i--;
n--;}}//初始化dp數組://裝滿的——只有0能裝滿0,其他的初始化爲負無窮
dp[0]=0;for(int i =1; i <= m; i++)
dp[i]=-99999;//不要求裝滿——所有的初始都爲0;
dp[MAX]={0};//核心代碼:for(int i =1; i <= n; i++)for(int j = w[i]; j <= m; j++)
dp[j]=max(dp[j], dp[j - w[i]]+ v[i]);//狀態轉移方程
cout << dp[m];return0;}