P1474 [USACO2.3]Money System / [USACO07OCT]Cow Cash G题解
题目传送门
分析:
这道题我们看到货币能无限使用就能够像到这是一道完全背包求方案数问题
我们先设一个
d
d
d数组,
d
i
d_i
di表示凑成
i
i
i的方案数
然后我们就只要考虑一个初始化的问题
因为他只有凑满了
i
i
i才能算一种方案,我们就可以就是将
d
0
d_0
d0初始化为1
动态转移方程就很容易推出来了
d
i
d_i
di=
m
a
x
max
max(
d
i
−
w
i
+
1
d_{i-w_i}+1
di−wi+1,
d
i
d_i
di)
因为他加过之后肯定比原数大所以我们可以进行优化
优化后等于
d
i
d_i
di=
d
i
−
w
i
+
1
d_{i-w_i}+1
di−wi+1;
有了状态转移方程,AC不是有手就行吗
CODE:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stdio.h>
#include<cstring>
using namespace std;
long long n,v,d[100100]={1},w[100100];
int main()
{
cin>>n>>v;
for (int i=0;i<n;i++)
cin>>w[i];
for (int i=0;i<n;i++)
for (int j=w[i];j<=v;j++)
d[j]+=d[j-w[i]];
cout<<d[v];
return 0;
}