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 后记

  1. 说实话可能初学\(DP\)时觉得状态转移方程都得带\(max\)\(min\)之类,但是并不绝对。还是有很多是不带的,要多从其他方面想\(qwq\)

  2. \(scanf\)/\(printf\)如果用 \(long\;long\) 等记得用 \(\%lld\) ,否则会以\(int\)型输入/出(血的教训)

posted @ 2021-07-14 20:08  BFNewdawn  阅读(41)  评论(0编辑  收藏  举报