狀態轉移方程:
dp[i][j]=max(dp[i- 1][j],dp[i-1][j-c[i]]+w[i]);
**:
#include#include#include#includeusing namespace std;
int value[510];
int weight[510];
int dp[100100];
int main()
}if(dp[fw-ew]<500000000)
printf("the minimum amount of money in the piggy-bank is %d.\n",dp[fw-ew]);
else
printf("this is impossible.\n");
}return 0;
}
可以發現這個**和01揹包中的不同之處在於第二重迴圈乙個是正序,乙個是倒序,這是因為「完全揹包的特點恰是每種物品可選無限件,所以在考慮「加
選一件第 i 種物品」這種策略時,卻正需要乙個可能已選入第 i 種物品的子結果 f[i,v − c i ] ,所以就可以並且必須採用 v 遞增的順序迴圈」(《揹包九講》)
還有初始化問題~注意一下
ps:樓主是dp菜鳥,覺得看了《揹包九講》學到了很多 ,因為內容很系統,有需要的童鞋也可以去看看噠~~
完全揹包 杭電 1114Piggy Bank
題目分析 給出了錢罐開始的重量 和裝滿後的重量 然後給你 種硬幣,每個價值為 重量為 求出最小的價值使錢罐的重量恰好為 如果不存在 輸出this is impossible.include include int main for i 1 i m i f 0 0 for i 1 i n i prin...
杭電1114 完全揹包
題目大意 有乙個存錢罐,給出它的重量和裝滿硬幣的重量,然後給出裡面裝的硬幣的種類數,並給出每種硬幣的面值和重量,求在給定重量的條件下硬幣的最小價值。解題思路 完全揹包。根據 揹包九講 這道題目相當於要求必須裝滿給出的重量,因此要使dp 0 0,同時因為求的是最小值,因此其他位置應該是正無窮。1 in...
hdu 1114 Piggy Bank(完全揹包)
題意 給出乙個存錢罐的容量,給出n種硬幣的價值p和重量w 注意 每種硬幣可無限取 1.如果存錢罐能夠正好塞滿,輸出塞滿存錢罐需要的最少硬幣的價值。2.若不能完全塞滿,則輸出impossible。思路 每種物品可以放無限多次。所以為完全揹包問題。此題是求最小值,為完全揹包的變形。注意初始化 dp 0 ...