題意:有n種紙幣面額(a1,a2,...an),每種面額對應有(c1,c2,...cn)張。問這些錢能拼成1-m中多少種值。
題解:揹包dp問題。若ci=1,是01揹包,若ci*ai>=m則是完全揹包,否則是多重揹包。(詳見《揹包九講》)
先複習一下三種簡單揹包形式:
01揹包(f[v] ← max ):
完全揹包(f[i, v] = max(f[i − 1, v], f[i, v −ci] +wi)):
多重揹包(利用二進位制思想轉化為01揹包):
利用三種揹包形式就可以輕鬆解決此題:
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;78
int f[100005];9
int c[105],a[105
];10
intn,m;
1112
void zeroonepack(int w,int
v)13
1718
void completepack(int w,int
v)19
2324
void multiplepack(int w,int v,int
c)25
32 zeroonepack(c*w,c*v);33}
3435
intmain()
3651
int ans=0;52
for(int i=1;i<=m;i++)
53if(f[i]==i) ans++;
54 printf("
%d\n
",ans);55}
56return0;
57 }
hdu 2844 多重揹包)
思路 其實就是多重揹包的應用,只是這裡價值和重量是相等的,因此最後計數是要計價值和重量相等的個數 1 include2 include3 const int n 100010 4 using namespace std 5int n,m 67 struct nodenode n 100 11 int...
hdu2844 多重揹包
讀題能力還是不行,英文水平不夠,只能靠翻譯 華沙人用硬幣。他們有價值a1 a2 a3的硬幣 一枚銀幣。一天,希比克斯開啟錢包,發現裡面有一些硬幣。他決定在附近的一家商店買一塊非常好的手錶。他想支付確切的 不找零 他知道 不會超過m,但他不知道手錶的確切 你要寫乙個程式,它讀取n,m,a1,a2,a3...
hdu 2844 多重揹包
真爽啊 打完一把絕對carry的亞索 來做這題 一發ac touch me 這題 反正資料很大 不用二進位制拆分 肯定tle的 反正 二進位制拆分 很簡單的啊 不會的 現在看我 學下就好了。1 include 2 include 3 using namespace std 45 const int ...