soj 3300 揹包裝滿(完全揹包)

2021-08-07 05:20:10 字數 1030 閱讀 3721

soj3300: stockholm coins

簡介題意:有n種硬幣,取錢,取多少才能把所有硬幣種類都取齊,即,每種至少取一枚的最少取得錢數是多少。

分析:如果說把所有種類錢幣都取出來的最小值,那不就是所有幣種幣值之和嗎?題目中也沒說有其他面額的錢呀,或者紙幣啥的?所以預設滿足題意輸出sum就行了。然後能不能的問題才是主要的,我思考的是,如果某種c幣值可以=a幣值+b幣值,那麼c,a,b就不一定能都取出來,另外一種比如a+b=c+d這兩種組合也不能出現。

那不就是,從小到大排列,假設從coins[0]到coins[n],那就是coins[0]到sum之間,所有值的dp都只能是1,因為組成方式只有1種,才可以滿足題意。

那就看看dp[j-a[i]]是否存在,如果存在呢,dp[j]++,就是j的組成方式又多了一種,從小到大排列,所以最後如果dp[sum]==1,那就滿足題意呀。

#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

const int max = 320000+10; //硬幣最大面值在10000

int dp[max];

int coins[35]; //題目中硬幣種類在1-32之間

int main()

sort(coins,coins+num);

for(int i = 0; i < num; i++)

for(int j = coins[i]; j <= sum; j++)

if(dp[j-coins[i]]) dp[j]++; //要是dp[j-coins[i]]存在,那dp[j]可以用dp[j-coins[i]]種方式+a[i]達成,所以dp[j]又多了一種,++

if(dp[sum] == 1) cout<

there is a blank line before each test case.這句沒看到就肯定wa了

我一共提交了三次,前兩次都是把幣值最大10000看成了1000,re,直到後來才改。。。

NYOJ 題目311 完全揹包(完全揹包,裝滿)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包 恰好裝滿揹包時,求出最...

完全揹包(裝滿)模板

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...

01揹包中揹包裝滿和不裝滿

揹包 有n 種不同的物品,每個物品有兩個屬性,v體積,c價值,現在給乙個體積為 m 的揹包,問 最多可帶走多少價值的物品。狀態轉移方程 dp i j max dp i 1 j dp i 1 j v i c i dp i 1 j 表示不放第i件物品的最大價值,dp i 1 j v i c i 表示放第...