這道題首先使用dp預處理,先求出,在不考慮每種硬幣個數的限制的情況下,構成每個錢數有多少種拼湊方案。
對於乙個d1,我們減去不合法的,也就是這種硬幣出現了d1+1及以上個,就是減去f【s-(d1+1)*c1】,以此類推
為了避免重複的方案被轉移,所以我們以硬幣種類為第一層迴圈,這樣階段性的增加硬幣。
一定要注意這個第一層迴圈要是硬幣種類,並且初始 f[0] = 1。
#include#include#include#includeusing namespace std;
typedef long long ll;
int c[5],d[5],s,tot;
ll f[100005];
int main()
printf("%lld\n",ans);
} return 0;
}
總結:
1:對於排列組合問題,容斥思想要長存
2:在一些計數的問題,for迴圈的順序會直接導致,f【i】所代表方案數的意義的不同。(比如這道題我們對於每一種方案的不同只是他們的數量不同影響的,他們放在一起的順序是不影響的,而如果將預處理的兩個迴圈調換一下位置,就導致也成了順序影響了,就不一樣的,這種需要多才、考慮一下,而我們乙個物品乙個物品的來,就可以保證只是數量影響了)
3:
BZOJ 1042 硬幣購物 (數論 容斥)
time limit 10 sec memory limit 162 mb description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s i的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c...
BZOJ1042 硬幣購物(動態規劃,容斥原理)
bzoj 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s i的價值的東西。請問每次有多少種付款方法。第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s 100000,tot 1000 每...
8 排列組合
1 2 permutations 3 排列組合 4 輸入abc,輸出所有可能的排列結果 5 輸入 abc 6 輸出 abc 7 acb 8 bac 9 bca 10 cab 11 cba 12 1314 include15 16using namespace std 1718 int c1 0 19...