這道題思路是在是神。
先dp出沒有限制時候的方案數。
dp的時候注意 先迴圈 1..4 再迴圈 1..maxs 防止重複。邊界是f[0] = 1。 這麼基礎的揹包都忘記了=_=
接下來處理有重複的問題,容斥原理
容斥原理說起來很簡單,但有一些很神奇的應用,比如這道題。
最終的答案 = 沒有限制的方案 - 其中一種超了限制的方案 + 其中兩種超了限制的方案 - 三種超了限制的方案 + 四種超了限制的方案
ans = f[s] + f[s - c[i]*(d[i]+1)] - …… + f[s - c[1]*(d[1]+1)……]
為什麼是 d[i]+1 呢?
至少用d[i]+1個,剩下的隨意,又是不限制的方案數了。
上**:
#include #include#include
#include
#include
#define n 100010
using
namespace
std;
int c[5], n, d[5
], s;
long
long f[n] = ;
void
make_f()
long
long
getans()
intmain()
return0;
}
BZOJ1042 HAOI2008 硬幣購物
description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買si的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s output 每次的方法...
bzoj1042 HAOI2008 硬幣購物
time limit 10 sec memory limit 162 mb submit 1835 solved 1074 submit status discuss 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s i的價值的東西...
bzoj1042 HAOI2008 硬幣購物
description 硬幣購物一共有4種硬幣。面值分別為c1,c2,c3,c4。某人去商店買東西,去了tot次。每次帶di枚ci硬幣,買s i的價值的東西。請問每次有多少種付款方法。input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s 1000...