CodeForces - 35D

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

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]);
}
View Code
相關文章
相關標籤/搜索