題目: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]); }