zcmu1381 簡單題(多重揹包)

2021-10-18 07:43:23 字數 1252 閱讀 6648

n種砝碼,每種砝碼重ai,有bi個,問你最小不能稱的重量是多大?最大不超過8500.

範圍:(a<100,b<100)

揹包題,有數量限制,那麼就是多重揹包,就是看揹包能不能裝滿,以下兩種dp方式求解01揹包。

1.dp[i]表示容量為i的包能不能裝滿,能的話dp[i]=1。

2.dp[i]表示容量為i的包能裝的最大價值,其中每個砝碼的價值等於重量本身,

最後從1開始往上累加,找到第乙個dp為0的,這個就是最小的不能稱出的重量。

解法1:

#includeusing namespace std;

#define ll long long

const int maxn = 1e4 + 5;

int dp[maxn], s; //dp[i]表示容量為i的包能否裝滿, s是最大容量

void bag1(int w)

void bag3(int w, int num)

bag1(w * num);

}int weight[maxn], num[maxn]; //weight表示砝碼重量,num表示砝碼數量

int main()

for(int i = 1; i <= n; i ++)

int id = 1;

while(dp[id]) id ++; //dp[id]==1說明裝滿了

printf("%d\n", id);

}return 0;

}

解法2:

#includeusing namespace std;

#define ll long long

const int maxn = 1e5 + 5;

int dp[maxn], s; //dp[i]表示容量為i的包能獲得最大價值,s是最大容量

void bag1(int w, int v)

void bag3(int w, int v, int num)

bag1(w * num, v * num);

}int weight[maxn], num[maxn];

int main()

for(int i = 1; i <= n; i ++)

int id = 1;

while(dp[id] == id) id ++; //最大價值等於重量說明裝滿了

printf("%d\n", id);

}return 0;

}

ZCMU1711揹包(dfs入門題)

你有乙個神奇的揹包,他的容積是m 0第一行 n,m 第二行 n個數字 輸出方案數 3 40 20 20 20 先將一下題意吧 乙個固定容積的揹包,然後給你n個物品,他們各自都有自己的容積,用這些物品去裝揹包,乙個前提條件就是一定要將揹包裝滿,不裝滿肯定不行,裝滿一次計數一次,大概就是這個意思了。剛剛...

三種簡單揹包問題模板 01揹包 完全揹包 多重揹包

概念 給定n種物品的價值和重量,每種物品最多只能取一次。求出當揹包容量為m時能夠裝下的最大價值 一維的寫法,dp陣列代表的是當前狀態能夠放下的最大價值 for int i 0 i w i j dp j max dp j dp j w i v i 對於第i件物品,可以放或不放。不放 dp j dp j...

hdu1171 多重揹包模板題

最近重新開始學dp,今天做到多重揹包這題,自己寫了乙個 感覺自己確實進步點了 嘻嘻。但是我沒看清題意n 0 退出迴圈,我wa 了無數次。下 面是自己寫的 include include include include include include include include include i...