链接:
https://vjudge.net/contest/263769#problem/C
题意:
问一种货币体系,对于任意数量的money,按照贪心和dp完全背包的做法拼凑,用的纸币数量是否一致。
思路:
分别跑,比较即可。
#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 2e6 + 10;
int n,top;
int dp[maxn],gr[maxn],a[110];
bool judge()
{
for(int i = 0 ; i < maxn ; i++) //容量
{
for(int j = 0; j < n ; j++) //数量
{
if(i - a[j] >= 0)
{
dp[i] = min(dp[i],dp[i-a[j]]+1);
gr[i] = gr[i-a[j]] + 1;
}
}
if(dp[i] != gr[i])
return 0;
}
return 1;
}
int main()
{
memset(dp,INF,sizeof dp);
memset(gr,0,sizeof gr);
dp[0] = 0;
cin>>n;
for(int i = 0 ; i < n; i++)
cin>>a[i];
top = a[n-1] * 2;
if(judge())
cout<<"canonical"<<endl;
else
cout<<"non-canonical"<<endl;
return 0;
}