P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G 题解
0x01 读题
\(……\)
0x02 分析
仔细看看,发现是一道完全背包变形问题。
我们珂以想:以 \(V\) 为外层循环,枚举每一个总方案的值
先看看规律:
自己可以在画图工具上画画,枚举\(4\)$5$种,蒟蒻画的太丑了~
0x03 状态转移方程
\(f[j]=f[j-m[i]]\)
0x04 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=10000010;
int v,n;
int m[N];
ll f[N];
int main(){
f[0]=1;
scanf("%d%d",&v,&n);
for(int i=1;i<=v;i++)
scanf("%d",&m[i]);
for(int i=1;i<=v;i++)
for(int j=m[i];j<=n;j++)
f[j]+=f[j-m[i]];
printf("%lld",f[n]);//注意ll!
return 0;
}
0x0F 后记
-
说实话可能初学\(DP\)时觉得状态转移方程都得带\(max\)、\(min\)之类,但是并不绝对。还是有很多是不带的,要多从其他方面想\(qwq\)
-
\(scanf\)/\(printf\)如果用 \(long\;long\) 等记得用 \(\%lld\) ,否则会以\(int\)型输入/出(血的教训)