关于DP数组初始化
查看原帖
关于DP数组初始化
578398
Dream_Flynn楼主2024/7/16 10:54

RT,看题解里面这个初始化看不明白。

题解代码:

#include <bits/stdc++.h>

using namespace std;

const int mod=100000000;//这里定义去模的数,尽量用常数 

long long cow[2005],f[2005][2005];//cow[i]指第i头奶牛的能力,f[i][j]是存前i件物品且余数正好为j时的最大值 

int main()
{
        int N,F;
        
	scanf("%d%d",&N,&F);//输入奶牛数量和幸运数 
    
	for (register int i=1;i<=N;i++) //适当的卡 
	{
		scanf("%d",&cow[i]);//输入奶牛能力 
		cow[i]%=F;//这里可以提前取模,减少时间 
	} 
    
	for (register int i=1;i<=N;i++) f[i][cow[i]]=1;//初始化 
	
        for (register int i=1;i<=N;i++)//列举前i件物品 
        {
    	     for (register int j=0;j<=F-1;j++)//列举余数 
             {
        	  f[i][j]=((f[i][j]+f[i-1][j])%mod+f[i-1][(j-cow[i]+F)%F])%mod;//状态转移方程应用 
             }
	}
    
	printf("%d",f[N][0]);//注意这里是到前n件物品且余数正好为0时的最大值 
    
	return 0;
}

有没有哪位大佬解释一下为什么第21行的初始化是写f[i][cow[i]]=1;

当在i之前有多个相同的,等于cow[i]的cow值时为什么这样做不影响答案的正确性?

2024/7/16 10:54
加载中...