题目:https://vjudge.net/contest/326867#problem/Ac++
题意:有一个农场,本身有m斤粮食,有n天,天天动物吃的量不一样,那个动物的食量的是由他是从那天开始进这个农场肯定的,后面不能再变,从这天进来后就必须吃到第n天,天天只能进来一个动物,问最后能被保留下来的动物数最大是多少ide
思路:spa
1.贪心+排序,既然他天天只能进入一个动物,并且动物进来后食量不变,并且进来知道吃多少天,那么至关于咱们知道全部动物的消费粮食值是多少个,而后咱们直接排序,选取最少的那几个便可 O(nlogn).net
#include<bits/stdc++.h> #define maxn 100005 #define mod 1000000007 using namespace std; typedef long long ll; ll a[maxn],n,m; int main(){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; a[i]=a[i]*(n-i+1); } sort(a+1,a+n+1); int num=0; for(int i=1;i<=n;i++){ if(m>=a[i]){ m-=a[i]; num++; } else break; } printf("%d",num); }
2.DP ,同样和上面,咱们能够知道每一个动物的消费粮食值,咱们能够转化为一个01背包问题, O(n*m),主要仍是当dp题来练手code
#include<bits/stdc++.h> #define maxn 100005 #define mod 1000000007 using namespace std; typedef long long ll; ll a[maxn],n,m; ll dp[maxn]; int main(){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; a[i]=a[i]*(n-i+1); } for(int i=1;i<=n;i++){ for(int j=m;j>=a[i];j--){ dp[j]=max(dp[j],dp[j-a[i]]+1); } } printf("%d",dp[m]); }